< Module looseEval: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 E E1 E2,
PrA : |{expr}- E ~~> E1 ->
PrB : |{expr}- E ~~> E2 ->
IsE : is_expr E ->
E1 = E2.
Proof completed.
< Projection_Constraint proj_expr_is :
forall E E',
Pr : |{expr}- E ~~> E' ->
IsE : is_expr E ->
is_expr 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.
< Projection_Constraint proj_value_unique :
forall V V1 V2,
PrA : |{value}- V ~~> V1 ->
PrB : |{value}- V ~~> V2 ->
IsV : is_value V ->
V1 = V2.
Proof completed.
< Projection_Constraint proj_value_is :
forall V V',
Pr : |{value}- V ~~> V' ->
IsV : is_value V ->
is_value V'.
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.
Proof completed.
< Ext_Ind forall E, is_expr E;
forall A, is_args A;
forall RF, is_recFieldExprs RF.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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: 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
R : is_expr (recBuild RecFieldExprs) @
R1 : is_recFieldExprs RecFieldExprs *
============================
<is_expr {P}> (recBuild RecFieldExprs)
< apply IH2 to R1.
Subgoal 1.17:
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
R : is_expr (recBuild RecFieldExprs) @
R1 : is_recFieldExprs RecFieldExprs *
H1 : <is_recFieldExprs {P}> RecFieldExprs
============================
<is_expr {P}> (recBuild RecFieldExprs)
< search.
Subgoal 1.18:
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
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.18:
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
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.19:
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
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.19:
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
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
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
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
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
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
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
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
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
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.
Proof completed.
< Proj_Rel is_stmt S.
Proof completed.
< Ext_Ind 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:
IH : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt noop @
============================
<is_stmt {P}> noop
< search.
Subgoal 2:
Variables: Stmt Stmt1
IH : 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 IH to R1.
Subgoal 2:
Variables: Stmt Stmt1
IH : 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 IH to R2.
Subgoal 2:
Variables: Stmt Stmt1
IH : 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 3:
Variables: Expr S1 Typ
IH : 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)
< search.
Subgoal 4:
Variables: Expr S1
IH : 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)
< search.
Subgoal 5:
Variables: Expr L S1
IH : 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)
< search.
Subgoal 6:
Variables: Stmt Stmt1 Expr
IH : 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 R2.
Subgoal 6:
Variables: Stmt Stmt1 Expr
IH : 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_stmt {P}> Stmt1
============================
<is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< apply IH to R3.
Subgoal 6:
Variables: Stmt Stmt1 Expr
IH : 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_stmt {P}> Stmt1
H2 : <is_stmt {P}> Stmt
============================
<is_stmt {P}> (ifThenElse Expr Stmt1 Stmt)
< search.
Subgoal 7:
Variables: Stmt Expr
IH : 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 R2.
Subgoal 7:
Variables: Stmt Expr
IH : 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_stmt {P}> Stmt
============================
<is_stmt {P}> (while Expr Stmt)
< search.
Subgoal 8:
Variables: Stmt
IH : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (scopeStmt Stmt) @
R1 : is_stmt Stmt *
============================
<is_stmt {P}> (scopeStmt Stmt)
< apply IH to R1.
Subgoal 8:
Variables: Stmt
IH : 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 9:
Variables: Expr
IH : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (printVal Expr) @
R1 : is_expr 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.
< Proj_Rel is_value V,
is_recFieldVals RFVs.
Proof completed.
< Ext_Ind forall V, is_value V;
forall RFVs, is_recFieldVals RFVs.
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 V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (intVal I) @
R1 : is_integer I
============================
<is_value {P}> (intVal I)
< search.
Subgoal 1.2:
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value trueVal @
============================
<is_value {P}> trueVal
< search.
Subgoal 1.3:
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value falseVal @
============================
<is_value {P}> falseVal
< search.
Subgoal 1.4:
Variables: S
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (stringVal S) @
R1 : is_string S
============================
<is_value {P}> (stringVal S)
< search.
Subgoal 1.5:
Variables: RecFieldVals
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (recVal RecFieldVals) @
R1 : is_recFieldVals RecFieldVals *
============================
<is_value {P}> (recVal RecFieldVals)
< apply IH1 to R1.
Subgoal 1.5:
Variables: RecFieldVals
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (recVal RecFieldVals) @
R1 : is_recFieldVals RecFieldVals *
H1 : <is_recFieldVals {P}> RecFieldVals
============================
<is_value {P}> (recVal RecFieldVals)
< search.
Subgoal 2.1:
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_recFieldVals nilRecFieldVals @
============================
<is_recFieldVals {P}> nilRecFieldVals
< search.
Subgoal 2.2:
Variables: RecFieldVals Value S
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
R1 : is_string S
R2 : is_value Value *
R3 : is_recFieldVals RecFieldVals *
============================
<is_recFieldVals {P}> (consRecFieldVals S Value RecFieldVals)
< apply IH to R2.
Subgoal 2.2:
Variables: RecFieldVals Value S
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
R1 : is_string S
R2 : is_value Value *
R3 : is_recFieldVals RecFieldVals *
H1 : <is_value {P}> Value
============================
<is_recFieldVals {P}> (consRecFieldVals S Value RecFieldVals)
< apply IH1 to R3.
Subgoal 2.2:
Variables: RecFieldVals Value S
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
R1 : is_string S
R2 : is_value Value *
R3 : is_recFieldVals RecFieldVals *
H1 : <is_value {P}> Value
H2 : <is_recFieldVals {P}> RecFieldVals
============================
<is_recFieldVals {P}> (consRecFieldVals S Value RecFieldVals)
< search.
Proof completed.
< Extensible_Theorem
is_value_intVal_or_not : forall V,
IsV : is_value V ->
(exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
on IsV.
Subgoal 1:
Variables: I
IH : forall V,
is_value V * -> (exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
(exists I1, intVal I1 = intVal I) \/
((exists I1, intVal I1 = intVal I) -> false)
< search.
Subgoal 2:
IH : forall V,
is_value V * -> (exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
IsV : is_value trueVal @
============================
(exists I, intVal I = trueVal) \/ ((exists I, intVal I = trueVal) -> false)
< search.
Subgoal 3:
IH : forall V,
is_value V * -> (exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
IsV : is_value falseVal @
============================
(exists I, intVal I = falseVal) \/ ((exists I, intVal I = falseVal) -> false)
< search.
Subgoal 4:
Variables: S
IH : forall V,
is_value V * -> (exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
(exists I, intVal I = stringVal S) \/
((exists I, intVal I = stringVal S) -> false)
< search.
Subgoal 5:
Variables: RecFieldVals
IH : forall V,
is_value V * -> (exists I, intVal I = V) \/
((exists I, intVal I = V) -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
(exists I, intVal I = recVal RecFieldVals) \/
((exists I, intVal I = recVal RecFieldVals) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_value_trueVal_or_not : forall V,
IsV : is_value V ->
trueVal = V \/
(trueVal = V -> false)
on IsV.
Subgoal 1:
Variables: I
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
trueVal = intVal I \/ (trueVal = intVal I -> false)
< search.
Subgoal 2:
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value trueVal @
============================
trueVal = trueVal \/ (trueVal = trueVal -> false)
< search.
Subgoal 3:
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value falseVal @
============================
trueVal = falseVal \/ (trueVal = falseVal -> false)
< search.
Subgoal 4:
Variables: S
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
trueVal = stringVal S \/ (trueVal = stringVal S -> false)
< search.
Subgoal 5:
Variables: RecFieldVals
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
trueVal = recVal RecFieldVals \/ (trueVal = recVal RecFieldVals -> false)
< search.
Proof completed.
< Extensible_Theorem
is_value_falseVal_or_not : forall V,
IsV : is_value V ->
falseVal = V \/
(falseVal = V -> false)
on IsV.
Subgoal 1:
Variables: I
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
falseVal = intVal I \/ (falseVal = intVal I -> false)
< search.
Subgoal 2:
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value trueVal @
============================
falseVal = trueVal \/ (falseVal = trueVal -> false)
< search.
Subgoal 3:
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value falseVal @
============================
falseVal = falseVal \/ (falseVal = falseVal -> false)
< search.
Subgoal 4:
Variables: S
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
falseVal = stringVal S \/ (falseVal = stringVal S -> false)
< search.
Subgoal 5:
Variables: RecFieldVals
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
falseVal = recVal RecFieldVals \/ (falseVal = recVal RecFieldVals -> false)
< search.
Proof completed.
< Extensible_Theorem
is_value_stringVal_or_not : forall V,
IsV : is_value V ->
(exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
on IsV.
Subgoal 1:
Variables: I
IH : forall V,
is_value V * -> (exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
(exists S, stringVal S = intVal I) \/
((exists S, stringVal S = intVal I) -> false)
< search.
Subgoal 2:
IH : forall V,
is_value V * -> (exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
IsV : is_value trueVal @
============================
(exists S, stringVal S = trueVal) \/
((exists S, stringVal S = trueVal) -> false)
< search.
Subgoal 3:
IH : forall V,
is_value V * -> (exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
IsV : is_value falseVal @
============================
(exists S, stringVal S = falseVal) \/
((exists S, stringVal S = falseVal) -> false)
< search.
Subgoal 4:
Variables: S
IH : forall V,
is_value V * -> (exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
(exists S1, stringVal S1 = stringVal S) \/
((exists S1, stringVal S1 = stringVal S) -> false)
< search.
Subgoal 5:
Variables: RecFieldVals
IH : forall V,
is_value V * -> (exists S, stringVal S = V) \/
((exists S, stringVal S = V) -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
(exists S, stringVal S = recVal RecFieldVals) \/
((exists S, stringVal S = recVal RecFieldVals) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_value_recVal_or_not : forall V,
IsV : is_value V ->
(exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
on IsV.
Subgoal 1:
Variables: I
IH : forall V,
is_value V * -> (exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
(exists Fs, recVal Fs = intVal I) \/
((exists Fs, recVal Fs = intVal I) -> false)
< search.
Subgoal 2:
IH : forall V,
is_value V * -> (exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
IsV : is_value trueVal @
============================
(exists Fs, recVal Fs = trueVal) \/ ((exists Fs, recVal Fs = trueVal) -> false)
< search.
Subgoal 3:
IH : forall V,
is_value V * -> (exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
IsV : is_value falseVal @
============================
(exists Fs, recVal Fs = falseVal) \/
((exists Fs, recVal Fs = falseVal) -> false)
< search.
Subgoal 4:
Variables: S
IH : forall V,
is_value V * -> (exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
(exists Fs, recVal Fs = stringVal S) \/
((exists Fs, recVal Fs = stringVal S) -> false)
< search.
Subgoal 5:
Variables: RecFieldVals
IH : forall V,
is_value V * -> (exists Fs, recVal Fs = V) \/
((exists Fs, recVal Fs = V) -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
(exists Fs, recVal Fs = recVal RecFieldVals) \/
((exists Fs, recVal Fs = recVal RecFieldVals) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_recFieldVals_nil_or_cons : forall RFVs,
IsRFVs : is_recFieldVals RFVs ->
RFVs = nilRecFieldVals \/
(exists F V R, RFVs = consRecFieldVals F V R)
on IsRFVs.
Subgoal 1:
IH : forall RFVs,
is_recFieldVals RFVs * -> RFVs = nilRecFieldVals \/
(exists F V R, RFVs = consRecFieldVals F V R)
IsRFVs : is_recFieldVals nilRecFieldVals @
============================
nilRecFieldVals = nilRecFieldVals \/
(exists F V R, nilRecFieldVals = consRecFieldVals F V R)
< search.
Subgoal 2:
Variables: RecFieldVals Value S
IH : forall RFVs,
is_recFieldVals RFVs * -> RFVs = nilRecFieldVals \/
(exists F V R, RFVs = consRecFieldVals F V R)
IsRFVs : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
IsRFVs1 : is_string S
IsRFVs2 : is_value Value *
IsRFVs3 : is_recFieldVals RecFieldVals *
============================
consRecFieldVals S Value RecFieldVals = nilRecFieldVals \/
(exists F V R, consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R)
< search.
Proof completed.
< Extensible_Theorem
is_value_eq_or_not : forall V1 V2,
Is1 : is_value V1 ->
Is2 : is_value V2 ->
V1 = V2 \/
(V1 = V2 -> false)
on Is1,
is_recFieldVals_eq_or_not : forall RFVs1 RFVs2,
Is1 : is_recFieldVals RFVs1 ->
Is2 : is_recFieldVals RFVs2 ->
RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
on Is1.
Subgoal 1.1:
Variables: V2 I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value V2
Is3 : is_integer I
============================
intVal I = V2 \/ (intVal I = V2 -> false)
< Or: apply is_value_intVal_or_not to Is2.
Subgoal 1.1:
Variables: V2 I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value V2
Is3 : is_integer I
Or : (exists I, intVal I = V2) \/ ((exists I, intVal I = V2) -> false)
============================
intVal I = V2 \/ (intVal I = V2 -> false)
< N: case Or.
Subgoal 1.1.1:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value (intVal I1)
Is3 : is_integer I
============================
intVal I = intVal I1 \/ (intVal I = intVal I1 -> false)
< Is': case Is2.
Subgoal 1.1.1:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is3 : is_integer I
Is' : is_integer I1
============================
intVal I = intVal I1 \/ (intVal I = intVal I1 -> false)
< Or: apply is_integer_eq_or_not to Is3 Is'.
Subgoal 1.1.1:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is3 : is_integer I
Is' : is_integer I1
Or : I = I1 \/ (I = I1 -> false)
============================
intVal I = intVal I1 \/ (intVal I = intVal I1 -> false)
< N: case Or.
Subgoal 1.1.1.1:
Variables: I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I1) @
Is3 : is_integer I1
Is' : is_integer I1
============================
intVal I1 = intVal I1 \/ (intVal I1 = intVal I1 -> false)
< search.
Subgoal 1.1.1.2:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is3 : is_integer I
Is' : is_integer I1
N : I = I1 -> false
============================
intVal I = intVal I1 \/ (intVal I = intVal I1 -> false)
< right.
Subgoal 1.1.1.2:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is3 : is_integer I
Is' : is_integer I1
N : I = I1 -> false
============================
intVal I = intVal I1 -> false
< intros E.
Subgoal 1.1.1.2:
Variables: I I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is3 : is_integer I
Is' : is_integer I1
N : I = I1 -> false
E : intVal I = intVal I1
============================
false
< case E.
Subgoal 1.1.1.2:
Variables: I1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I1) @
Is3 : is_integer I1
Is' : is_integer I1
N : I1 = I1 -> false
============================
false
< backchain N.
Subgoal 1.1.2:
Variables: V2 I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value V2
Is3 : is_integer I
N : (exists I, intVal I = V2) -> false
============================
intVal I = V2 \/ (intVal I = V2 -> false)
< right.
Subgoal 1.1.2:
Variables: V2 I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value V2
Is3 : is_integer I
N : (exists I, intVal I = V2) -> false
============================
intVal I = V2 -> false
< intros E.
Subgoal 1.1.2:
Variables: V2 I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value V2
Is3 : is_integer I
N : (exists I, intVal I = V2) -> false
E : intVal I = V2
============================
false
< case E.
Subgoal 1.1.2:
Variables: I
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (intVal I) @
Is2 : is_value (intVal I)
Is3 : is_integer I
N : (exists I1, intVal I1 = intVal I) -> false
============================
false
< backchain N.
Subgoal 1.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value V2
============================
trueVal = V2 \/ (trueVal = V2 -> false)
< Or: apply is_value_trueVal_or_not to Is2.
Subgoal 1.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value V2
Or : trueVal = V2 \/ (trueVal = V2 -> false)
============================
trueVal = V2 \/ (trueVal = V2 -> false)
< N: case Or.
Subgoal 1.2.1:
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value trueVal
============================
trueVal = trueVal \/ (trueVal = trueVal -> false)
< search.
Subgoal 1.2.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value V2
N : trueVal = V2 -> false
============================
trueVal = V2 \/ (trueVal = V2 -> false)
< right.
Subgoal 1.2.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value V2
N : trueVal = V2 -> false
============================
trueVal = V2 -> false
< intros E.
Subgoal 1.2.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value V2
N : trueVal = V2 -> false
E : trueVal = V2
============================
false
< case E.
Subgoal 1.2.2:
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value trueVal @
Is2 : is_value trueVal
N : trueVal = trueVal -> false
============================
false
< backchain N.
Subgoal 1.3:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value V2
============================
falseVal = V2 \/ (falseVal = V2 -> false)
< Or: apply is_value_falseVal_or_not to Is2.
Subgoal 1.3:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value V2
Or : falseVal = V2 \/ (falseVal = V2 -> false)
============================
falseVal = V2 \/ (falseVal = V2 -> false)
< N: case Or.
Subgoal 1.3.1:
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value falseVal
============================
falseVal = falseVal \/ (falseVal = falseVal -> false)
< search.
Subgoal 1.3.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value V2
N : falseVal = V2 -> false
============================
falseVal = V2 \/ (falseVal = V2 -> false)
< right.
Subgoal 1.3.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value V2
N : falseVal = V2 -> false
============================
falseVal = V2 -> false
< intros E.
Subgoal 1.3.2:
Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value V2
N : falseVal = V2 -> false
E : falseVal = V2
============================
false
< case E.
Subgoal 1.3.2:
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value falseVal @
Is2 : is_value falseVal
N : falseVal = falseVal -> false
============================
false
< backchain N.
Subgoal 1.4:
Variables: V2 S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value V2
Is3 : is_string S
============================
stringVal S = V2 \/ (stringVal S = V2 -> false)
< Or: apply is_value_stringVal_or_not to Is2.
Subgoal 1.4:
Variables: V2 S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value V2
Is3 : is_string S
Or : (exists S, stringVal S = V2) \/ ((exists S, stringVal S = V2) -> false)
============================
stringVal S = V2 \/ (stringVal S = V2 -> false)
< N: case Or.
Subgoal 1.4.1:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value (stringVal S1)
Is3 : is_string S
============================
stringVal S = stringVal S1 \/ (stringVal S = stringVal S1 -> false)
< Is': case Is2.
Subgoal 1.4.1:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is3 : is_string S
Is' : is_string S1
============================
stringVal S = stringVal S1 \/ (stringVal S = stringVal S1 -> false)
< Or: apply is_string_eq_or_not to Is3 Is'.
Subgoal 1.4.1:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is3 : is_string S
Is' : is_string S1
Or : S = S1 \/ (S = S1 -> false)
============================
stringVal S = stringVal S1 \/ (stringVal S = stringVal S1 -> false)
< N: case Or.
Subgoal 1.4.1.1:
Variables: S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S1) @
Is3 : is_string S1
Is' : is_string S1
============================
stringVal S1 = stringVal S1 \/ (stringVal S1 = stringVal S1 -> false)
< search.
Subgoal 1.4.1.2:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is3 : is_string S
Is' : is_string S1
N : S = S1 -> false
============================
stringVal S = stringVal S1 \/ (stringVal S = stringVal S1 -> false)
< right.
Subgoal 1.4.1.2:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is3 : is_string S
Is' : is_string S1
N : S = S1 -> false
============================
stringVal S = stringVal S1 -> false
< intros E.
Subgoal 1.4.1.2:
Variables: S S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is3 : is_string S
Is' : is_string S1
N : S = S1 -> false
E : stringVal S = stringVal S1
============================
false
< case E.
Subgoal 1.4.1.2:
Variables: S1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S1) @
Is3 : is_string S1
Is' : is_string S1
N : S1 = S1 -> false
============================
false
< backchain N.
Subgoal 1.4.2:
Variables: V2 S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value V2
Is3 : is_string S
N : (exists S, stringVal S = V2) -> false
============================
stringVal S = V2 \/ (stringVal S = V2 -> false)
< right.
Subgoal 1.4.2:
Variables: V2 S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value V2
Is3 : is_string S
N : (exists S, stringVal S = V2) -> false
============================
stringVal S = V2 -> false
< intros E.
Subgoal 1.4.2:
Variables: V2 S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value V2
Is3 : is_string S
N : (exists S, stringVal S = V2) -> false
E : stringVal S = V2
============================
false
< case E.
Subgoal 1.4.2:
Variables: S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (stringVal S) @
Is2 : is_value (stringVal S)
Is3 : is_string S
N : (exists S1, stringVal S1 = stringVal S) -> false
============================
false
< backchain N.
Subgoal 1.5:
Variables: V2 RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value V2
Is3 : is_recFieldVals RecFieldVals *
============================
recVal RecFieldVals = V2 \/ (recVal RecFieldVals = V2 -> false)
< Or: apply is_value_recVal_or_not to Is2.
Subgoal 1.5:
Variables: V2 RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value V2
Is3 : is_recFieldVals RecFieldVals *
Or : (exists Fs, recVal Fs = V2) \/ ((exists Fs, recVal Fs = V2) -> false)
============================
recVal RecFieldVals = V2 \/ (recVal RecFieldVals = V2 -> false)
< N: case Or.
Subgoal 1.5.1:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value (recVal Fs)
Is3 : is_recFieldVals RecFieldVals *
============================
recVal RecFieldVals = recVal Fs \/ (recVal RecFieldVals = recVal Fs -> false)
< Is': case Is2.
Subgoal 1.5.1:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is3 : is_recFieldVals RecFieldVals *
Is' : is_recFieldVals Fs
============================
recVal RecFieldVals = recVal Fs \/ (recVal RecFieldVals = recVal Fs -> false)
< Or: apply IH1 to Is3 Is'.
Subgoal 1.5.1:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is3 : is_recFieldVals RecFieldVals *
Is' : is_recFieldVals Fs
Or : RecFieldVals = Fs \/ (RecFieldVals = Fs -> false)
============================
recVal RecFieldVals = recVal Fs \/ (recVal RecFieldVals = recVal Fs -> false)
< N: case Or.
Subgoal 1.5.1.1:
Variables: Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal Fs) @
Is3 : is_recFieldVals Fs *
Is' : is_recFieldVals Fs
============================
recVal Fs = recVal Fs \/ (recVal Fs = recVal Fs -> false)
< search.
Subgoal 1.5.1.2:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is3 : is_recFieldVals RecFieldVals *
Is' : is_recFieldVals Fs
N : RecFieldVals = Fs -> false
============================
recVal RecFieldVals = recVal Fs \/ (recVal RecFieldVals = recVal Fs -> false)
< right.
Subgoal 1.5.1.2:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is3 : is_recFieldVals RecFieldVals *
Is' : is_recFieldVals Fs
N : RecFieldVals = Fs -> false
============================
recVal RecFieldVals = recVal Fs -> false
< intros E.
Subgoal 1.5.1.2:
Variables: RecFieldVals Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is3 : is_recFieldVals RecFieldVals *
Is' : is_recFieldVals Fs
N : RecFieldVals = Fs -> false
E : recVal RecFieldVals = recVal Fs
============================
false
< case E.
Subgoal 1.5.1.2:
Variables: Fs
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal Fs) @
Is3 : is_recFieldVals Fs *
Is' : is_recFieldVals Fs
N : Fs = Fs -> false
============================
false
< backchain N.
Subgoal 1.5.2:
Variables: V2 RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value V2
Is3 : is_recFieldVals RecFieldVals *
N : (exists Fs, recVal Fs = V2) -> false
============================
recVal RecFieldVals = V2 \/ (recVal RecFieldVals = V2 -> false)
< right.
Subgoal 1.5.2:
Variables: V2 RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value V2
Is3 : is_recFieldVals RecFieldVals *
N : (exists Fs, recVal Fs = V2) -> false
============================
recVal RecFieldVals = V2 -> false
< intros E.
Subgoal 1.5.2:
Variables: V2 RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value V2
Is3 : is_recFieldVals RecFieldVals *
N : (exists Fs, recVal Fs = V2) -> false
E : recVal RecFieldVals = V2
============================
false
< case E.
Subgoal 1.5.2:
Variables: RecFieldVals
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_value (recVal RecFieldVals) @
Is2 : is_value (recVal RecFieldVals)
Is3 : is_recFieldVals RecFieldVals *
N : (exists Fs, recVal Fs = recVal RecFieldVals) -> false
============================
false
< backchain N.
Subgoal 2.1:
Variables: RFVs2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals RFVs2
============================
nilRecFieldVals = RFVs2 \/ (nilRecFieldVals = RFVs2 -> false)
< Or: apply is_recFieldVals_nil_or_cons to Is2.
Subgoal 2.1:
Variables: RFVs2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals RFVs2
Or : RFVs2 = nilRecFieldVals \/ (exists F V R, RFVs2 = consRecFieldVals F V R)
============================
nilRecFieldVals = RFVs2 \/ (nilRecFieldVals = RFVs2 -> false)
< case Or.
Subgoal 2.1.1:
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals nilRecFieldVals
============================
nilRecFieldVals = nilRecFieldVals \/
(nilRecFieldVals = nilRecFieldVals -> false)
< search.
Subgoal 2.1.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals (consRecFieldVals F V R)
============================
nilRecFieldVals = consRecFieldVals F V R \/
(nilRecFieldVals = consRecFieldVals F V R -> false)
< right.
Subgoal 2.1.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals (consRecFieldVals F V R)
============================
nilRecFieldVals = consRecFieldVals F V R -> false
< intros E.
Subgoal 2.1.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals nilRecFieldVals @
Is2 : is_recFieldVals (consRecFieldVals F V R)
E : nilRecFieldVals = consRecFieldVals F V R
============================
false
< case E.
Subgoal 2.2:
Variables: RFVs2 RecFieldVals Value S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals RFVs2
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
============================
consRecFieldVals S Value RecFieldVals = RFVs2 \/
(consRecFieldVals S Value RecFieldVals = RFVs2 -> false)
< Or: apply is_recFieldVals_nil_or_cons to Is2.
Subgoal 2.2:
Variables: RFVs2 RecFieldVals Value S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals RFVs2
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Or : RFVs2 = nilRecFieldVals \/ (exists F V R, RFVs2 = consRecFieldVals F V R)
============================
consRecFieldVals S Value RecFieldVals = RFVs2 \/
(consRecFieldVals S Value RecFieldVals = RFVs2 -> false)
< case Or.
Subgoal 2.2.1:
Variables: RecFieldVals Value S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals nilRecFieldVals
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
============================
consRecFieldVals S Value RecFieldVals = nilRecFieldVals \/
(consRecFieldVals S Value RecFieldVals = nilRecFieldVals -> false)
< right.
Subgoal 2.2.1:
Variables: RecFieldVals Value S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals nilRecFieldVals
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
============================
consRecFieldVals S Value RecFieldVals = nilRecFieldVals -> false
< intros E.
Subgoal 2.2.1:
Variables: RecFieldVals Value S
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals nilRecFieldVals
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
E : consRecFieldVals S Value RecFieldVals = nilRecFieldVals
============================
false
< case E.
Subgoal 2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is2 : is_recFieldVals (consRecFieldVals F V R)
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
============================
consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R -> false)
< Is': case Is2.
Subgoal 2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
============================
consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R -> false)
< Or: apply is_string_eq_or_not to Is3 Is'.
Subgoal 2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
Or : S = F \/ (S = F -> false)
============================
consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R -> false)
< N: case Or.
Subgoal 2.2.2.1:
Variables: RecFieldVals Value F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F Value RecFieldVals) @
Is3 : is_string F
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
============================
consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R -> false)
< Or: apply IH to Is4 Is'1.
Subgoal 2.2.2.1:
Variables: RecFieldVals Value F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F Value RecFieldVals) @
Is3 : is_string F
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
Or : Value = V \/ (Value = V -> false)
============================
consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R -> false)
< N: case Or.
Subgoal 2.2.2.1.1:
Variables: RecFieldVals F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V RecFieldVals) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
============================
consRecFieldVals F V RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F V RecFieldVals = consRecFieldVals F V R -> false)
< Or: apply IH1 to Is5 Is'2.
Subgoal 2.2.2.1.1:
Variables: RecFieldVals F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V RecFieldVals) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
Or : RecFieldVals = R \/ (RecFieldVals = R -> false)
============================
consRecFieldVals F V RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F V RecFieldVals = consRecFieldVals F V R -> false)
< N: case Or.
Subgoal 2.2.2.1.1.1:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V R) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals R *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
============================
consRecFieldVals F V R = consRecFieldVals F V R \/
(consRecFieldVals F V R = consRecFieldVals F V R -> false)
< search.
Subgoal 2.2.2.1.1.2:
Variables: RecFieldVals F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V RecFieldVals) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : RecFieldVals = R -> false
============================
consRecFieldVals F V RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F V RecFieldVals = consRecFieldVals F V R -> false)
< right.
Subgoal 2.2.2.1.1.2:
Variables: RecFieldVals F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V RecFieldVals) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : RecFieldVals = R -> false
============================
consRecFieldVals F V RecFieldVals = consRecFieldVals F V R -> false
< intros E.
Subgoal 2.2.2.1.1.2:
Variables: RecFieldVals F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V RecFieldVals) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : RecFieldVals = R -> false
E : consRecFieldVals F V RecFieldVals = consRecFieldVals F V R
============================
false
< case E.
Subgoal 2.2.2.1.1.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V R) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals R *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : R = R -> false
============================
false
< backchain N.
Subgoal 2.2.2.1.2:
Variables: RecFieldVals Value F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F Value RecFieldVals) @
Is3 : is_string F
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : Value = V -> false
============================
consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R -> false)
< right.
Subgoal 2.2.2.1.2:
Variables: RecFieldVals Value F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F Value RecFieldVals) @
Is3 : is_string F
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : Value = V -> false
============================
consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R -> false
< intros E.
Subgoal 2.2.2.1.2:
Variables: RecFieldVals Value F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F Value RecFieldVals) @
Is3 : is_string F
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : Value = V -> false
E : consRecFieldVals F Value RecFieldVals = consRecFieldVals F V R
============================
false
< case E.
Subgoal 2.2.2.1.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V R) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals R *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : V = V -> false
============================
false
< backchain N.
Subgoal 2.2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : S = F -> false
============================
consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R \/
(consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R -> false)
< right.
Subgoal 2.2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : S = F -> false
============================
consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R -> false
< intros E.
Subgoal 2.2.2.2:
Variables: RecFieldVals Value S F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals S Value RecFieldVals) @
Is3 : is_string S
Is4 : is_value Value *
Is5 : is_recFieldVals RecFieldVals *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : S = F -> false
E : consRecFieldVals S Value RecFieldVals = consRecFieldVals F V R
============================
false
< case E.
Subgoal 2.2.2.2:
Variables: F V R
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
(RFVs1 = RFVs2 -> false)
Is1 : is_recFieldVals (consRecFieldVals F V R) @
Is3 : is_string F
Is4 : is_value V *
Is5 : is_recFieldVals R *
Is' : is_string F
Is'1 : is_value V
Is'2 : is_recFieldVals R
N : F = F -> false
============================
false
< backchain N.
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 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.17:
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.17:
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.17:
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.18:
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.18:
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.18:
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.18:
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.19:
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.19:
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.19:
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.19:
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 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.17:
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.17:
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.18:
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.18:
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.18:
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.19:
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.19:
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.19:
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: 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.17:
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.18:
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.18:
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.19:
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.19:
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.
< Projection_Constraint proj_vars :
forall E E_P V V_P X,
Pr : |{expr}- E ~~> E_P ->
IsE : is_expr E ->
V : vars E V ->
V_P : vars E_P V_P ->
Mem : mem X V ->
mem X V_P.
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 as IH_Ealso
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 as IH_A,
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 as IH_RF.
Subgoal 1.1:
Variables: FT ET I
IH_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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_E : 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
IH_A : 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
IH_RF : 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 FieldTys Fields
IH_E : 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
IH_A : 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
IH_RF : 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.19:
Variables: FT ET FieldTys Fields
IH_E : 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
IH_A : 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
IH_RF : 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 IH_RF to _ _ _ Ty1.
Subgoal 1.19:
Variables: FT ET FieldTys Fields
IH_E : 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
IH_A : 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
IH_RF : 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.20:
Variables: FT ET Ty FieldTys Field E1
IH_E : 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
IH_A : 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
IH_RF : 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.20:
Variables: FT ET Ty FieldTys Field E1
IH_E : 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
IH_A : 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
IH_RF : 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_E to _ _ _ Ty1.
Subgoal 1.20:
Variables: FT ET Ty FieldTys Field E1
IH_E : 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
IH_A : 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
IH_RF : 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.20:
Variables: FT ET Ty FieldTys Field E1
IH_E : 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
IH_A : 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
IH_RF : 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.20:
Variables: FT ET Ty FieldTys Field E1
IH_E : 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
IH_A : 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
IH_RF : 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.21:
Variables: FT ET Ty Msg
IH_E : 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
IH_A : 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
IH_RF : 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.21:
Variables: FT ET Ty Msg
IH_E : 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
IH_A : 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
IH_RF : 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:
Variables: A FT ET Tys
IH_E : 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
IH_A : 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
IH_RF : 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 2.1:
Variables: FT ET
IH_E : 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
IH_A : 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
IH_RF : 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 2.2:
Variables: FT ET ETys ETy Rest E
IH_E : 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
IH_A : 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
IH_RF : 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 2.2:
Variables: FT ET ETys ETy Rest E
IH_E : 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
IH_A : 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
IH_RF : 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_E to _ _ _ Ty.
Subgoal 2.2:
Variables: FT ET ETys ETy Rest E
IH_E : 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
IH_A : 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
IH_RF : 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 IH_A to _ _ _ Ty1.
Subgoal 2.2:
Variables: FT ET ETys ETy Rest E
IH_E : 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
IH_A : 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
IH_RF : 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 3:
Variables: RF FT ET Fields
IH_E : 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
IH_A : 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
IH_RF : 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 3.1:
Variables: FT ET
IH_E : 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
IH_A : 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
IH_RF : 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 3.2:
Variables: FT ET RestTys ETy Name Rest E
IH_E : 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
IH_A : 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
IH_RF : 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 3.2:
Variables: FT ET RestTys ETy Name Rest E
IH_E : 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
IH_A : 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
IH_RF : 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_E to _ _ _ Ty.
Subgoal 3.2:
Variables: FT ET RestTys ETy Name Rest E
IH_E : 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
IH_A : 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
IH_RF : 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 IH_RF to _ _ _ Ty1.
Subgoal 3.2:
Variables: FT ET RestTys ETy Name Rest E
IH_E : 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
IH_A : 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
IH_RF : 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_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 Ty.
Subgoal 1:
Variables: FT ET'
IH : 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'
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:
Variables: FT ET ET' TC1 S2 S1
IH : 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'
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:
Variables: FT ET ET' TC1 S2 S1
IH : 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'
IsFT : is_list (is_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 IH to _ _ _ Ty1.
Subgoal 2:
Variables: FT ET ET' TC1 S2 S1
IH : 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'
IsFT : is_list (is_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 IH to _ _ _ Ty2.
Subgoal 2:
Variables: FT ET ET' TC1 S2 S1
IH : 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'
IsFT : is_list (is_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 3:
Variables: FT RestTC Scope Ty X E
IH : 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'
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 3:
Variables: FT RestTC Scope Ty X E
IH : 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'
IsFT : is_list (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 typeOf_isTy to _ _ _ Ty2.
Subgoal 3:
Variables: FT RestTC Scope Ty X E
IH : 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'
IsFT : is_list (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 3:
Variables: FT RestTC Scope Ty X E
IH : 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'
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 4:
Variables: FT ET' Ty E X
IH : 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'
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 5:
Variables: FT ET' FieldTys Ty E Fields Rec
IH : 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'
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 6:
Variables: FT ET' TCTh TCEl El Th Cond
IH : 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'
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 7:
Variables: FT ET' TC2 Body Cond
IH : 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'
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 8:
Variables: FT ET' TC2 S1
IH : 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'
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 9:
Variables: FT ET' E
IH : 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'
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 10:
Variables: FT ET' E
IH : 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'
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 11:
Variables: FT ET' E
IH : 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'
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.
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_Ealso
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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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 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_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.19:
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_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.19:
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_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.19:
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_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.20:
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_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.20:
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_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.20:
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_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.20:
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_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.20:
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_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.21:
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_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.21:
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_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:
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_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 2.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_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 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_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 2.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_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 2.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_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 2.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_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 2.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_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 2.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_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 3:
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_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 3.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_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 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_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 3.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_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 3.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_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 3.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_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 3.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_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 3.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_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
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_S.
Subgoal 1:
Variables: FT ET_B ET_A' ET_B'
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'
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 1:
Variables: FT ET_A' ET_B'
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2
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'
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:
Variables: FT ET_A ET_B ET_A' ET_B' TC1 S2 S1 TC2
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'
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 3:
Variables: FT ET_B ET_B' RestTC Scope Ty X E
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'
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 3:
Variables: FT ET_B ET_B' RestTC Scope Ty X E
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'
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 3:
Variables: FT RestTC Scope Ty X E RestTC1 Scope1
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'
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 typeOf_unique to _ _ _ _ TyA2 TyB1 _.
Subgoal 3:
Variables: FT RestTC Scope Ty X E RestTC1 Scope1
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'
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 4:
Variables: FT ET_B ET_A' ET_B' Ty E X
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'
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 4:
Variables: FT ET_A' ET_B' Ty E X Ty1
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'
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 5:
Variables: FT ET_B ET_A' ET_B' FieldTys Ty E Fields Rec
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'
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 5:
Variables: FT ET_B ET_A' ET_B' FieldTys Ty E Fields Rec
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'
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 5:
Variables: FT ET_A' ET_B' FieldTys Ty E Fields Rec FieldTys1 Ty1
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'
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 6:
Variables: FT ET_B ET_A' ET_B' TCTh TCEl El Th Cond
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'
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 6:
Variables: FT ET_A' ET_B' TCTh TCEl El Th Cond TCTh1 TCEl1
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'
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 7:
Variables: FT ET_B ET_A' ET_B' TC2 Body Cond
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'
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 7:
Variables: FT ET_A' ET_B' TC2 Body Cond TC1
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'
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 8:
Variables: FT ET_B ET_A' ET_B' TC2 S1
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'
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 8:
Variables: FT ET_A' ET_B' TC2 S1 TC1
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'
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 9:
Variables: FT ET_B ET_A' ET_B' E
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'
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 9.1:
Variables: FT ET_A' ET_B' E
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'
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 9.2:
Variables: FT ET_A' ET_B' E
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'
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 9.3:
Variables: FT ET_A' ET_B' E
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'
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 10:
Variables: FT ET_B ET_A' ET_B' E
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'
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 10.1:
Variables: FT ET_A' ET_B' E
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'
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 10.2:
Variables: FT ET_A' ET_B' E
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'
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 10.3:
Variables: FT ET_A' ET_B' E
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'
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 11:
Variables: FT ET_B ET_A' ET_B' E
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'
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 11.1:
Variables: FT ET_A' ET_B' E
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'
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 11.2:
Variables: FT ET_A' ET_B' E
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'
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 11.3:
Variables: FT ET_A' ET_B' E
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'
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.
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 lookupRecFieldVal_is :
forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V -> is_value V.
============================
forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V -> is_value V
< induction on 2.
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
============================
forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V @ -> is_value V
< intros Is LRFV.
Variables: RFVs F V
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
Is : is_recFieldVals RFVs
LRFV : lookupRecFieldVal RFVs F V @
============================
is_value V
< LRFV: case LRFV.
Subgoal 1:
Variables: F V Rest
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
Is : is_recFieldVals (consRecFieldVals F V Rest)
============================
is_value V
< case Is.
Subgoal 1:
Variables: F V Rest
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
H1 : is_string F
H2 : is_value V
H3 : is_recFieldVals Rest
============================
is_value V
< search.
Subgoal 2:
Variables: F V Rest VA FA
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
Is : is_recFieldVals (consRecFieldVals FA VA Rest)
LRFV : FA = F -> false
LRFV1 : lookupRecFieldVal Rest F V *
============================
is_value V
< case Is.
Subgoal 2:
Variables: F V Rest VA FA
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
LRFV : FA = F -> false
LRFV1 : lookupRecFieldVal Rest F V *
H1 : is_string FA
H2 : is_value VA
H3 : is_recFieldVals Rest
============================
is_value V
< apply IH to _ LRFV1.
Subgoal 2:
Variables: F V Rest VA FA
IH : forall RFVs F V,
is_recFieldVals RFVs -> lookupRecFieldVal RFVs F V * -> is_value V
LRFV : FA = F -> false
LRFV1 : lookupRecFieldVal Rest F V *
H1 : is_string FA
H2 : is_value VA
H3 : is_recFieldVals Rest
H4 : is_value V
============================
is_value V
< search.
Proof completed.
< Theorem replaceRecVal_is :
forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' -> is_recFieldVals RFVs'.
============================
forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' -> is_recFieldVals RFVs'
< induction on 3.
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
============================
forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' @ -> is_recFieldVals RFVs'
< intros IsV IsRFVs RRV.
Variables: F V RFVs RFVs'
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
RRV : replaceRecVal F V RFVs RFVs' @
============================
is_recFieldVals RFVs'
< RRV: case RRV.
Subgoal 1:
Variables: F V Rest VOld
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals (consRecFieldVals F VOld Rest)
============================
is_recFieldVals (consRecFieldVals F V Rest)
< Is: case IsRFVs.
Subgoal 1:
Variables: F V Rest VOld
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
Is : is_string F
Is1 : is_value VOld
Is2 : is_recFieldVals Rest
============================
is_recFieldVals (consRecFieldVals F V Rest)
< search.
Subgoal 2:
Variables: F V RRest VO O Rest
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals (consRecFieldVals O VO Rest)
RRV : F = O -> false
RRV1 : replaceRecVal F V Rest RRest *
============================
is_recFieldVals (consRecFieldVals O VO RRest)
< Is: case IsRFVs.
Subgoal 2:
Variables: F V RRest VO O Rest
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
RRV : F = O -> false
RRV1 : replaceRecVal F V Rest RRest *
Is : is_string O
Is1 : is_value VO
Is2 : is_recFieldVals Rest
============================
is_recFieldVals (consRecFieldVals O VO RRest)
< apply IH to _ _ RRV1.
Subgoal 2:
Variables: F V RRest VO O Rest
IH : forall F V RFVs RFVs',
is_value V -> is_recFieldVals RFVs -> replaceRecVal F V RFVs RFVs' * -> is_recFieldVals RFVs'
IsV : is_value V
RRV : F = O -> false
RRV1 : replaceRecVal F V Rest RRest *
Is : is_string O
Is1 : is_value VO
Is2 : is_recFieldVals Rest
H1 : is_recFieldVals RRest
============================
is_recFieldVals (consRecFieldVals O VO RRest)
< search.
Proof completed.
< Theorem updateRecFields_is :
forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' ->
is_recFieldVals RFVs'.
============================
forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' ->
is_recFieldVals RFVs'
< induction on 4.
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
============================
forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' @ ->
is_recFieldVals RFVs'
< intros IsV IsFs IsRFVs U.
Variables: Fs V RFVs RFVs'
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsFs : is_list is_string Fs
IsRFVs : is_recFieldVals RFVs
U : updateRecFields Fs V RFVs RFVs' @
============================
is_recFieldVals RFVs'
< U: case U.
Subgoal 1:
Variables: V RFVs RFVs' F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsFs : is_list is_string [F]
IsRFVs : is_recFieldVals RFVs
U : replaceRecVal F V RFVs RFVs'
============================
is_recFieldVals RFVs'
< apply replaceRecVal_is to _ _ U.
Subgoal 1:
Variables: V RFVs RFVs' F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsFs : is_list is_string [F]
IsRFVs : is_recFieldVals RFVs
U : replaceRecVal F V RFVs RFVs'
H1 : is_recFieldVals RFVs'
============================
is_recFieldVals RFVs'
< case IsFs.
Subgoal 1:
Variables: V RFVs RFVs' F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : replaceRecVal F V RFVs RFVs'
H1 : is_recFieldVals RFVs'
H2 : is_string F
H3 : is_list is_string []
============================
is_recFieldVals RFVs'
< search.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsFs : is_list is_string (F::FRest)
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
============================
is_recFieldVals RFVs'
< IsFs: case IsFs.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
IsFs : is_string F
IsFs1 : is_list is_string FRest
============================
is_recFieldVals RFVs'
< IsRV: apply lookupRecFieldVal_is to _ U.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
IsFs : is_string F
IsFs1 : is_list is_string FRest
IsRV : is_value (recVal Fields)
============================
is_recFieldVals RFVs'
< case IsRV.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
IsFs : is_string F
IsFs1 : is_list is_string FRest
H1 : is_recFieldVals Fields
============================
is_recFieldVals RFVs'
< apply IH to _ _ _ U1.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
IsFs : is_string F
IsFs1 : is_list is_string FRest
H1 : is_recFieldVals Fields
H2 : is_recFieldVals Updated
============================
is_recFieldVals RFVs'
< apply replaceRecVal_is to _ _ U2.
Subgoal 2:
Variables: V RFVs RFVs' Fields Updated FRest F
IH : forall Fs V RFVs RFVs',
is_value V -> is_list is_string Fs -> is_recFieldVals RFVs -> updateRecFields Fs V RFVs RFVs' * ->
is_recFieldVals RFVs'
IsV : is_value V
IsRFVs : is_recFieldVals RFVs
U : lookupRecFieldVal RFVs F (recVal Fields)
U1 : updateRecFields FRest V Fields Updated *
U2 : replaceRecVal F (recVal Updated) RFVs RFVs'
IsFs : is_string F
IsFs1 : is_list is_string FRest
H1 : is_recFieldVals Fields
H2 : is_recFieldVals Updated
H3 : is_recFieldVals RFVs'
============================
is_recFieldVals RFVs'
< search.
Proof completed.
< Extensible_Theorem
evalExpr_isValue : forall FE 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 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_isValue : forall FE 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 O ->
is_list is_value V
on Ev as IH_V_A,
evalRecFields_isValue : forall FE 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 O ->
is_recFieldVals V
on Ev as IH_V_RF.
Subgoal 1.1:
Variables: FE EE I
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) [] @
============================
is_value (intVal I)
< case IsE.
Subgoal 1.1:
Variables: FE EE I
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) [] @
H1 : is_integer I
============================
is_value (intVal I)
< search.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
============================
is_value (intVal I)
< case IsE.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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)
< IsI2: apply IH_V_E to _ _ _ Ev2.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI1 : is_value (intVal I1)
IsI2 : is_value (intVal I2)
============================
is_value (intVal I)
< case IsI1.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI2 : is_value (intVal I2)
H3 : is_integer I1
============================
is_value (intVal I)
< case IsI2.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
============================
is_value (intVal I)
< apply plus_integer_is_integer to _ _ Ev3.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
H5 : is_integer I
============================
is_value (intVal I)
< search.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
============================
is_value (intVal I)
< case IsE.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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)
< IsI2: apply IH_V_E to _ _ _ Ev2.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI1 : is_value (intVal I1)
IsI2 : is_value (intVal I2)
============================
is_value (intVal I)
< case IsI1.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI2 : is_value (intVal I2)
H3 : is_integer I1
============================
is_value (intVal I)
< case IsI2.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
============================
is_value (intVal I)
< apply minus_integer_is_integer to _ _ Ev3.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
H5 : is_integer I
============================
is_value (intVal I)
< search.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
============================
is_value (intVal I)
< case IsE.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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)
< IsI2: apply IH_V_E to _ _ _ Ev2.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI1 : is_value (intVal I1)
IsI2 : is_value (intVal I2)
============================
is_value (intVal I)
< case IsI1.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI2 : is_value (intVal I2)
H3 : is_integer I1
============================
is_value (intVal I)
< case IsI2.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
============================
is_value (intVal I)
< apply multiply_integer_is_integer to _ _ Ev3.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
H5 : is_integer I
============================
is_value (intVal I)
< search.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
============================
is_value (intVal I)
< case IsE.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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)
< IsI2: apply IH_V_E to _ _ _ Ev2.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI1 : is_value (intVal I1)
IsI2 : is_value (intVal I2)
============================
is_value (intVal I)
< case IsI1.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI2 : is_value (intVal I2)
H3 : is_integer I1
============================
is_value (intVal I)
< case IsI2.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
============================
is_value (intVal I)
< apply divide_integer_is_integer to _ _ Ev3.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer I1
H4 : is_integer I2
H5 : is_integer I
============================
is_value (intVal I)
< search.
Subgoal 1.6:
Variables: FE EE
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] @
============================
is_value trueVal
< search.
Subgoal 1.7:
Variables: FE EE
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] @
============================
is_value falseVal
< search.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_value trueVal
< search.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
is_value falseVal
< search.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_value falseVal
< search.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
is_value trueVal
< search.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_value trueVal
< search.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_value falseVal
< search.
Subgoal 1.14:
Variables: FE EE O E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
is_value trueVal
< search.
Subgoal 1.15:
Variables: FE EE O E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
is_value falseVal
< search.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
============================
is_value trueVal
< search.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
============================
is_value falseVal
< search.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
============================
is_value trueVal
< search.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
============================
is_value falseVal
< search.
Subgoal 1.20:
Variables: FE EE S
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) [] @
============================
is_value (stringVal S)
< case IsE.
Subgoal 1.20:
Variables: FE EE S
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) [] @
H1 : is_string S
============================
is_value (stringVal S)
< search.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
============================
is_value (stringVal S)
< case IsE.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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)
< IsI2: apply IH_V_E to _ _ _ Ev2.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI1 : is_value (stringVal S1)
IsI2 : is_value (stringVal S2)
============================
is_value (stringVal S)
< case IsI1.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
IsI2 : is_value (stringVal S2)
H3 : is_string S1
============================
is_value (stringVal S)
< case IsI2.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_string S1
H4 : is_string S2
============================
is_value (stringVal S)
< apply is_string_append to _ _ Ev3.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_string S1
H4 : is_string S2
H5 : is_string S
============================
is_value (stringVal S)
< search.
Subgoal 1.22:
Variables: FE EE V X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] @
Ev1 : lookupScopes X EE V
============================
is_value V
< case IsE.
Subgoal 1.22:
Variables: FE EE V X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] @
Ev1 : lookupScopes X EE V
H1 : is_string X
============================
is_value V
< apply lookupScopes_is to _ Ev1.
Subgoal 1.22:
Variables: FE EE V X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] @
Ev1 : lookupScopes X EE V
H1 : is_string X
H2 : is_value V
H3 : is_string X
============================
is_value V
< search.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
============================
is_value V
< IsF: apply lookup_is_value_funCtx to _ Ev1.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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)) EE2
============================
is_value V
< apply lookupScopes_is to _ Ev6.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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)) EE2
H6 : is_value V
H7 : is_string RetVar
============================
is_value V
< search.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalRecFields FE EE RF VF O *
============================
is_value (recVal VF)
< case IsE.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
============================
is_value (recVal VF)
< apply IH_V_RF to _ _ _ Ev1.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
H2 : is_recFieldVals VF
============================
is_value (recVal VF)
< search.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
============================
is_value V
< Is: case IsE.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
Is : is_expr Rec
Is1 : is_string F
============================
is_value V
< IsRV: apply IH_V_E to _ _ _ Ev1.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
Is : is_expr Rec
Is1 : is_string F
IsRV : is_value (recVal Fields)
============================
is_value V
< case IsRV.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
Is : is_expr Rec
Is1 : is_string F
H1 : is_recFieldVals Fields
============================
is_value V
< apply lookupRecFieldVal_is to _ Ev2.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
Is : is_expr Rec
Is1 : is_string F
H1 : is_recFieldVals Fields
H2 : is_value V
============================
is_value V
< search.
Subgoal 2.1:
Variables: FE EE'
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.2:
Variables: FE EE EE' O EE3 O2 O3 S2 S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.2:
Variables: FE EE EE' O EE3 O2 O3 S2 S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.2:
Variables: FE EE EE' O EE3 O2 O3 S2 S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.2:
Variables: FE EE EE' O EE3 O2 O3 S2 S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE1)
< case IsS.
Subgoal 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
< apply IH_V_E to _ _ _ Ev1.
Subgoal 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : is_value V
============================
is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE1)
< case IsEE.
Subgoal 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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)) EE1
============================
is_list (is_list (is_pair is_string is_value)) (((X, V)::Scope)::EE1)
< search.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : replaceScopes X V EE EE'
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev1.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
H3 : is_value V
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev2.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
H3 : is_value V
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 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
IsRV1 : is_string Rec
H4 : is_recFieldVals FieldVals
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev1.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
IsRV1 : is_string Rec
H4 : is_recFieldVals FieldVals
H5 : is_value V
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply updateRecFields_is to _ _ _ Ev3.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
IsRV1 : is_string Rec
H4 : is_recFieldVals FieldVals
H5 : is_value V
H6 : is_recFieldVals NewVals
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev4.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
IsRV1 : is_string Rec
H4 : is_recFieldVals FieldVals
H5 : is_value V
H6 : is_recFieldVals NewVals
H7 : 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.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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'
< Is': apply IH_C_S to _ _ _ Ev2.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
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 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
H4 : is_list (is_pair is_string is_value) Scope
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 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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'
< Is': apply IH_C_S to _ _ _ Ev2.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
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 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
H4 : is_list (is_pair is_string is_value) Scope
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 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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'
< IsEE4+: apply IH_C_S to _ _ _ Ev2.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
H1 : is_expr Cond
H2 : is_stmt Body
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsEE4+.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_pair is_string is_value) Scope
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_S to _ _ _ Ev3.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_pair is_string is_value) Scope
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 2.9:
Variables: FE EE' O Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 2.10:
Variables: FE EE EE' O Scope S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.10:
Variables: FE EE EE' O Scope S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.10:
Variables: FE EE EE' O Scope S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.10:
Variables: FE EE EE' O Scope S1
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 2.11:
Variables: FE EE' O I O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.11:
Variables: FE EE' O I O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 2.12:
Variables: FE EE' O O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : O2 ++ [trueVal] = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.12:
Variables: FE EE' O O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 2.13:
Variables: FE EE' O O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : O2 ++ [falseVal] = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.13:
Variables: FE EE' O O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 2.14:
Variables: FE EE' O S1 O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsS.
Subgoal 2.14:
Variables: FE EE' O S1 O2 E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 3.1:
Variables: FE EE
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 [] [] @
============================
is_list is_value []
< search.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value (V1::VRest)
< case IsA.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
============================
is_list is_value (V1::VRest)
< apply IH_V_E to _ _ _ Ev1.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : is_value V1
============================
is_list is_value (V1::VRest)
< apply IH_V_A to _ _ _ Ev2.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : is_value V1
H4 : is_list is_value VRest
============================
is_list is_value (V1::VRest)
< search.
Subgoal 4.1:
Variables: FE EE
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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 nilRecFieldVals [] @
============================
is_recFieldVals nilRecFieldVals
< search.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
is_recFieldVals (consRecFieldVals F V1 VRest)
< case IsRF.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
============================
is_recFieldVals (consRecFieldVals F V1 VRest)
< apply IH_V_E to _ _ _ Ev1.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
H4 : is_value V1
============================
is_recFieldVals (consRecFieldVals F V1 VRest)
< apply IH_V_RF to _ _ _ Ev2.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_V_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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_V_A : forall FE EE A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value V
IH_V_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V O * ->
is_recFieldVals 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
H4 : is_value V1
H5 : is_recFieldVals VRest
============================
is_recFieldVals (consRecFieldVals 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 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 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 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 O ->
is_list is_value O
on Ev as IH_A,
evalRecFields_isOutput : forall FE 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 O ->
is_list is_value O
on Ev as IH_RF.
Subgoal 1.1:
Variables: FE EE I
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) [] @
============================
is_list is_value []
< search.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.6:
Variables: FE EE
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 [] @
============================
is_list is_value []
< search.
Subgoal 1.7:
Variables: FE EE
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 [] @
============================
is_list is_value []
< search.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 IH_E to _ _ _ Ev2.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
is_list is_value O
< case IsE.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal 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 O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 IH_E to _ _ _ Ev2.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
is_list is_value O
< case IsE.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal 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 O E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 IH_E to _ _ _ Ev2.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 IH_E to _ _ _ Ev2.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
is_list is_value O
< case IsE.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
H2 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
is_list is_value O
< case IsE.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
H2 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 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 O V1 O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 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 IH_E to _ _ _ Ev2.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 O V1 O2 V2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 IH_E to _ _ _ Ev2.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.20:
Variables: FE EE S
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) [] @
============================
is_list is_value []
< search.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 O S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.22:
Variables: FE EE V X
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 [] @
Ev1 : lookupScopes X EE V
============================
is_list is_value []
< search.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
============================
is_list is_value O
< IsFP: apply lookup_is_value_funCtx to _ Ev1.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O VF RF
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalRecFields FE EE RF VF O *
============================
is_list is_value O
< case IsE.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
============================
is_list is_value O
< apply IH_RF to _ _ _ Ev1.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
H2 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
============================
is_list is_value O
< case IsE.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O EE1 Scope V X E Ty
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
is_list is_value O
< case IsS.
Subgoal 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 O EE1 Scope V X E Ty
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 E X
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : replaceScopes X V EE EE'
============================
is_list is_value O
< case IsS.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : replaceScopes X V EE 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 E X
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : replaceScopes X V EE 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 FieldVals NewVals E Fields Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
============================
is_list is_value O
< case IsS.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 FieldVals NewVals E Fields Rec
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsS.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 IH_S to _ _ _ Ev2.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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_value O3
H6 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsS.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 IH_S to _ _ _ Ev2.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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_value O3
H6 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 IH_S to _ _ _ Ev2.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
============================
is_list is_value O
< Is: apply evalStmt_isCtx to _ _ _ Ev2.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
Is : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
is_list is_value O
< case Is.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
is_list is_value O
< apply IH_S to _ _ _ Ev3.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_list is_value O4
============================
is_list is_value O
< apply append_values_is to _ _ Ev4.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_list is_value O4
H8 : is_list is_value O12
============================
is_list is_value O
< apply append_values_is to _ _ Ev5.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_value O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_list is_value O4
H8 : is_list is_value O12
H9 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O *
============================
is_list is_value O
< case IsS.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O Body Cond
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
is_list is_value O
< case IsS.
Subgoal 2.11:
Variables: FE EE' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O I O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : O2 ++ [trueVal] = O
============================
is_list is_value O
< case IsS.
Subgoal 2.12:
Variables: FE EE' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 O2 *
Ev2 : O2 ++ [falseVal] = O
============================
is_list is_value O
< case IsS.
Subgoal 2.13:
Variables: FE EE' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 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' O S1 O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
is_list is_value O
< case IsS.
Subgoal 2.14:
Variables: FE EE' O S1 O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O S1 O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O S1 O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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' O S1 O2 E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) 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 E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 [] [] @
============================
is_list is_value []
< search.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsA.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 O O2 O3 VRest V1 Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 IH_A to _ _ _ Ev2.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V1 Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 4.1:
Variables: FE EE
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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 nilRecFieldVals [] @
============================
is_list is_value []
< search.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsRF.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 O O2 O3 VRest V1 F Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 IH_RF to _ _ _ Ev2.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V1 F Rest E
IH_E : forall FE EE E V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 A V O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V O * ->
is_list is_value O
IH_RF : forall FE EE RF V O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V 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) (consRecFieldVals F V1 VRest) O @
Ev1 : evalExpr FE EE E V1 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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_value O3
H6 : 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
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.
Subgoal 1:
Variables: FE Scope 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''
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 1:
Variables: FE Scope 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''
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 1:
Variables: FE Scope 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''
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:
Variables: FE Scope EE EE' O EE3 O2 O3 S2 S1
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''
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:
Variables: FE Scope EE EE' O EE3 O2 O3 S2 S1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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:
Variables: FE Scope EE EE' O O2 O3 S2 S1 Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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:
Variables: FE Scope EE EE' O O2 O3 S2 S1 Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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:
Variables: FE Scope EE O O2 O3 S2 S1 Scope' EE'' Scope'1 EE''1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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:
Variables: FE Scope EE O O2 O3 S2 S1 Scope' EE'' Scope'1 EE''1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 3:
Variables: FE Scope EE O V X E Ty
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''
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)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
============================
exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 3:
Variables: FE Scope EE O V X E Ty
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
< case IsEE.
Subgoal 3:
Variables: FE Scope EE O V X E Ty
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE
============================
exists Scope' EE'', ((X, V)::Scope)::EE = Scope'::EE'' /\ names_same EE EE''
< exists (X, V)::Scope,
EE.
Subgoal 3:
Variables: FE Scope EE O V X E Ty
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE
============================
((X, V)::Scope)::EE = ((X, V)::Scope)::EE /\ names_same EE EE
< split.
Subgoal 3.1:
Variables: FE Scope EE O V X E Ty
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE
============================
((X, V)::Scope)::EE = ((X, V)::Scope)::EE
< search.
Subgoal 3.2:
Variables: FE Scope EE O V X E Ty
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''
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Ev : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE
============================
names_same EE EE
< backchain names_same_reflexive.
Subgoal 4:
Variables: FE Scope EE EE' O V E X
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''
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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 4:
Variables: FE Scope EE EE' O V E X
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply replaceScopes_names_same to _ Ev2.
Subgoal 4:
Variables: FE Scope EE EE' O V E X
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O *
Ev2 : replaceScopes X V (Scope::EE) EE'
H1 : is_string X
H2 : is_expr E
NS : names_same (Scope::EE) EE'
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 4:
Variables: FE Scope EE O V E X BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (B::BRest) O @
Ev1 : evalExpr FE (Scope::EE) E V O *
Ev2 : replaceScopes X V (Scope::EE) (B::BRest)
H1 : is_string X
H2 : is_expr E
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 5:
Variables: FE Scope EE EE' O V FieldVals NewVals E Fields Rec
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''
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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) EE'
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 5:
Variables: FE Scope EE EE' O V FieldVals NewVals E Fields Rec
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) 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: apply replaceScopes_names_same to _ Ev4.
Subgoal 5:
Variables: FE Scope EE EE' O V FieldVals NewVals E Fields Rec
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
NS : names_same (Scope::EE) EE'
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 5:
Variables: FE Scope EE O V FieldVals NewVals E Fields Rec BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O *
Ev2 : lookupScopes Rec (Scope::EE) (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) (Scope::EE) (B::BRest)
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H6 : names_same EE BRest
============================
exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 6:
Variables: FE Scope EE EE' O O2 Scope1 O3 El Th Cond
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''
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Th (Scope1::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 6:
Variables: FE Scope EE EE' O O2 Scope1 O3 El Th Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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: apply IH_S to _ _ _ Ev2.
Subgoal 6:
Variables: FE Scope EE O O2 O3 El Th Cond Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Th (Scope'::EE'') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
NS : names_same (Scope::EE) EE''
============================
exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< case NS.
Subgoal 6:
Variables: FE Scope EE O O2 O3 El Th Cond Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Th (Scope'::(B::BRest)) O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H6 : names_same EE BRest
============================
exists Scope' EE''1, B::BRest = Scope'::EE''1 /\ names_same EE EE''1
< search.
Subgoal 7:
Variables: FE Scope EE EE' O O2 Scope1 O3 El Th Cond
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''
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) El (Scope1::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 7:
Variables: FE Scope EE EE' O O2 Scope1 O3 El Th Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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: apply IH_S to _ _ _ Ev2.
Subgoal 7:
Variables: FE Scope EE O O2 O3 El Th Cond Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) El (Scope'::EE'') O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
NS : names_same (Scope::EE) EE''
============================
exists Scope' EE''1, EE'' = Scope'::EE''1 /\ names_same EE EE''1
< case NS.
Subgoal 7:
Variables: FE Scope EE O O2 O3 El Th Cond Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) El (Scope'::(B::BRest)) O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr Cond
H2 : is_stmt Th
H3 : is_stmt El
H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H6 : names_same EE BRest
============================
exists Scope' EE''1, B::BRest = Scope'::EE''1 /\ names_same EE EE''1
< search.
Subgoal 8:
Variables: FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond
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''
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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 8:
Variables: FE Scope EE EE' O O2 Scope1 EE3 O3 O4 O12 Body Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope1::EE3) O3 *
Ev3 : evalStmt FE EE3 (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_B: apply IH_S to _ _ _ Ev2.
Subgoal 8:
Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) 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_B : names_same (Scope::EE) EE''
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_B': case NS_B.
Subgoal 8:
Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope'::(B::BRest)) O3 *
Ev3 : evalStmt FE (B::BRest) (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
H1 : is_expr Cond
H2 : is_stmt Body
NS_B' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
NS_B'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
NS_B'2 : names_same EE BRest
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< IsEE''+: apply evalStmt_isCtx to _ _ _ Ev2.
Subgoal 8:
Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope'::(B::BRest)) O3 *
Ev3 : evalStmt FE (B::BRest) (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
H1 : is_expr Cond
H2 : is_stmt Body
NS_B' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
NS_B'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
NS_B'2 : names_same EE BRest
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::(B::BRest))
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsEE''+.
Subgoal 8:
Variables: FE Scope EE EE' O O2 O3 O4 O12 Body Cond Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope'::(B::BRest)) O3 *
Ev3 : evalStmt FE (B::BRest) (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
H1 : is_expr Cond
H2 : is_stmt Body
NS_B' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
NS_B'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
NS_B'2 : names_same EE BRest
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
============================
exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS_W: apply IH_S to _ _ _ Ev3.
Subgoal 8:
Variables: FE Scope EE O O2 O3 O4 O12 Body Cond Scope' BRest B Scope'1 EE''1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope'::(B::BRest)) O3 *
Ev3 : evalStmt FE (B::BRest) (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_B' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
NS_B'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
NS_B'2 : names_same EE BRest
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
NS_W : names_same BRest EE''1
============================
exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_transitive to NS_B'2 NS_W.
Subgoal 8:
Variables: FE Scope EE O O2 O3 O4 O12 Body Cond Scope' BRest B Scope'1 EE''1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 O2 *
Ev2 : evalStmt FE ([]::(Scope::EE)) Body (Scope'::(B::BRest)) O3 *
Ev3 : evalStmt FE (B::BRest) (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_B' : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
NS_B'1 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
NS_B'2 : names_same EE BRest
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
NS_W : names_same BRest EE''1
NS : names_same EE EE''1
============================
exists Scope' EE'', Scope'1::EE''1 = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 9:
Variables: FE Scope EE O Body Cond
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''
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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 9:
Variables: FE Scope EE O Body Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE.
Subgoal 9:
Variables: FE Scope EE O Body Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
H1 : is_expr Cond
H2 : is_stmt Body
NS : names_same (Scope::EE) (Scope::EE)
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 9:
Variables: FE Scope EE O Body Cond
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE) O @
Ev1 : evalExpr FE (Scope::EE) Cond falseVal O *
H1 : is_expr Cond
H2 : is_stmt Body
H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope
H4 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope
H5 : names_same EE EE
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 10:
Variables: FE Scope EE EE' O Scope1 S1
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''
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 10:
Variables: FE Scope EE EE' O Scope1 S1
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 10:
Variables: FE Scope EE O S1 Scope' 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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 10:
Variables: FE Scope EE O S1 Scope' BRest B
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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 11:
Variables: FE Scope EE O I O2 E
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''
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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 11:
Variables: FE Scope EE O I O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE.
Subgoal 11:
Variables: FE Scope EE O I O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
NS : names_same (Scope::EE) (Scope::EE)
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 11:
Variables: FE Scope EE O I O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (intVal I) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope
H3 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope
H4 : names_same EE EE
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 12:
Variables: FE Scope EE O O2 E
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''
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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 12:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE.
Subgoal 12:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
NS : names_same (Scope::EE) (Scope::EE)
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 12:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope
H3 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope
H4 : names_same EE EE
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 13:
Variables: FE Scope EE O O2 E
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''
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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 13:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE.
Subgoal 13:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
NS : names_same (Scope::EE) (Scope::EE)
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 13:
Variables: FE Scope EE O O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E falseVal O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope
H3 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope
H4 : names_same EE EE
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< search.
Subgoal 14:
Variables: FE Scope EE O S1 O2 E
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''
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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case IsS.
Subgoal 14:
Variables: FE Scope EE O S1 O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< NS: apply names_same_reflexive to IsEE.
Subgoal 14:
Variables: FE Scope EE O S1 O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
NS : names_same (Scope::EE) (Scope::EE)
============================
exists Scope' EE'', Scope::EE = Scope'::EE'' /\ names_same EE EE''
< case NS.
Subgoal 14:
Variables: FE Scope EE O S1 O2 E
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''
IsFE : is_list (is_pair is_string (is_pair is_string (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) (Scope::EE) O @
Ev1 : evalExpr FE (Scope::EE) E (stringVal S1) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
H2 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) Scope
H3 : forall X IB, mem (X, IB) Scope -> exists IA, mem (X, IA) Scope
H4 : names_same EE EE
============================
exists Scope' EE'', Scope::EE = Scope'::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 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 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 (consRecFieldVals F VOld Rest) B
============================
consRecFieldVals 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
============================
consRecFieldVals F V Rest = consRecFieldVals 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
============================
consRecFieldVals F V Rest = consRecFieldVals 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 (consRecFieldVals O VO Rest) B
A : F = O -> false
A1 : replaceRecVal F V Rest RRest *
============================
consRecFieldVals 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 *
============================
consRecFieldVals O VO RRest = consRecFieldVals 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
============================
consRecFieldVals O VO RRest = consRecFieldVals 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
============================
consRecFieldVals O VO RRest1 = consRecFieldVals O VO RRest1
< search.
Proof completed.
< Theorem lookupRecFieldVal_unique :
forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA -> lookupRecFieldVal RFVs F VB -> VA = VB.
============================
forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA -> lookupRecFieldVal RFVs F VB -> VA = VB
< induction on 1.
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
============================
forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA @ -> lookupRecFieldVal RFVs F VB -> VA = VB
< intros LA LB.
Variables: RFVs F VA VB
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LA : lookupRecFieldVal RFVs F VA @
LB : lookupRecFieldVal RFVs F VB
============================
VA = VB
< LA: case LA.
Subgoal 1:
Variables: F VA VB Rest
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LB : lookupRecFieldVal (consRecFieldVals F VA Rest) F VB
============================
VA = VB
< LB: case LB.
Subgoal 1.1:
Variables: F VB Rest
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
============================
VB = VB
< search.
Subgoal 1.2:
Variables: F VA VB Rest
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LB : F = F -> false
LB1 : lookupRecFieldVal Rest F VB
============================
VA = VB
< apply LB to _.
Subgoal 2:
Variables: F VA VB Rest VA1 FA
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LB : lookupRecFieldVal (consRecFieldVals FA VA1 Rest) F VB
LA : FA = F -> false
LA1 : lookupRecFieldVal Rest F VA *
============================
VA = VB
< LB: case LB.
Subgoal 2.1:
Variables: F VA VB Rest
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LA : F = F -> false
LA1 : lookupRecFieldVal Rest F VA *
============================
VA = VB
< apply LA to _.
Subgoal 2.2:
Variables: F VA VB Rest VA1 FA
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LA : FA = F -> false
LA1 : lookupRecFieldVal Rest F VA *
LB : FA = F -> false
LB1 : lookupRecFieldVal Rest F VB
============================
VA = VB
< apply IH to LA1 LB1.
Subgoal 2.2:
Variables: F VB Rest VA1 FA
IH : forall RFVs F VA VB,
lookupRecFieldVal RFVs F VA * -> lookupRecFieldVal RFVs F VB -> VA = VB
LA : FA = F -> false
LA1 : lookupRecFieldVal Rest F VB *
LB : FA = F -> false
LB1 : lookupRecFieldVal Rest F VB
============================
VB = VB
< 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal L F1 (recVal Fields)
UA1 : updateRecFields FRest V Fields Updated *
UA2 : replaceRecVal F1 (recVal Updated) L OutA
UB : lookupRecFieldVal L F1 (recVal Fields1)
UB1 : updateRecFields FRest V Fields1 Updated1
UB2 : replaceRecVal F1 (recVal Updated1) L OutB
============================
OutA = OutB
< apply lookupRecFieldVal_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 : lookupRecFieldVal L F1 (recVal Fields1)
UA1 : updateRecFields FRest V Fields1 Updated *
UA2 : replaceRecVal F1 (recVal Updated) L OutA
UB : lookupRecFieldVal 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 : lookupRecFieldVal L F1 (recVal Fields1)
UA1 : updateRecFields FRest V Fields1 Updated1 *
UA2 : replaceRecVal F1 (recVal Updated1) L OutA
UB : lookupRecFieldVal 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 : lookupRecFieldVal L F1 (recVal Fields1)
UA1 : updateRecFields FRest V Fields1 Updated1 *
UA2 : replaceRecVal F1 (recVal Updated1) L OutB
UB : lookupRecFieldVal L F1 (recVal Fields1)
UB1 : updateRecFields FRest V Fields1 Updated1
UB2 : replaceRecVal F1 (recVal Updated1) L OutB
============================
OutB = OutB
< search.
Proof completed.
< Ext_Size evalExpr FE EE E V O,
evalArgs FE EE E V O,
evalRecFields FE EE E F O,
evalStmt FE EE S EE' O.
Proof completed.
< Proj_Rel evalExpr FE EE E V O,
evalArgs FE EE E V O,
evalRecFields FE EE E F O,
evalStmt FE EE S EE' O.
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 N Len (A : list (list (pair (string) V))) (B : list (list (pair (string) V))) BLen,
newNameScopes N Len A B -> length B BLen -> Len <= BLen.
============================
forall N Len A B BLen, newNameScopes N Len A B -> length B BLen -> Len <= BLen
< induction on 1.
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
============================
forall N Len A B BLen,
newNameScopes N Len A B @ -> length B BLen -> Len <= BLen
< intros NNS Len.
Variables: N Len A B BLen
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N Len A B @
Len : length B BLen
============================
Len <= BLen
< NNS: case NNS.
Subgoal 1:
Variables: N Len A B BLen N1 SNames BNames
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
Len : length B BLen
NNS : length B Len
NNS1 : drop N1 A B
NNS2 : take N1 A N
NNS3 : names N 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: N Len A B N1 SNames BNames
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
Len : length B Len
NNS : length B Len
NNS1 : drop N1 A B
NNS2 : take N1 A N
NNS3 : names N 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: N Len A B N1 SNames BNames
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
Len : length B Len
NNS : length B Len
NNS1 : drop N1 A B
NNS2 : take N1 A N
NNS3 : names N 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: N Len BLen BR S AR
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
Len : length (S::BR) BLen
NNS : newNameScopes N Len AR BR *
============================
Len <= BLen
< Len: case Len.
Subgoal 2:
Variables: N Len BLen BR S AR N'
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N Len AR BR *
Len : length BR N'
Len1 : 1 + N' = BLen
============================
Len <= BLen
< LEq: apply IH to NNS Len.
Subgoal 2:
Variables: N Len BLen BR S AR N'
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N Len AR BR *
Len : length BR N'
Len1 : 1 + N' = BLen
LEq : Len <= N'
============================
Len <= BLen
< apply length_is to Len.
Subgoal 2:
Variables: N Len BLen BR S AR N'
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N 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: N Len BLen BR S AR N'
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N 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: N Len BLen BR S AR N'
IH : forall N Len A B BLen,
newNameScopes N Len A B * -> length B BLen -> Len <= BLen
NNS : newNameScopes N 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_rel : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A ->
EvB : evalExpr FE EE_B E VB O_B ->
Vars : vars E Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
VA = VB /\
O_A = O_B
on EvA as IH_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_rel : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A ->
EvB : evalArgs FE EE_B A VB O_B ->
Vars : varsArgs A Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
VA = VB /\
O_A = O_B
on EvA as IH_A,
evalRecFields_rel : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A ->
EvB : evalRecFields FE EE_B RF VB O_B ->
Vars : varsRecFields RF Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
VA = VB /\
O_A = O_B
on EvA as IH_RF.
Subgoal 1.1:
Variables: FE EE_A EE_B VB O_B Vars I
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) [] @
EvB : evalExpr FE EE_B (num I) VB O_B
Vars : vars (num I) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
intVal I = VB /\ [] = O_B
< case EvB.
Subgoal 1.1:
Variables: FE EE_A EE_B Vars I
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) [] @
Vars : vars (num I) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
intVal I = intVal I /\ [] = []
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (plus E1 E2) VB O_B
Vars : vars (plus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 + I2 = I
EvA4 : O1 ++ O2 = O_A
============================
intVal I = VB /\ O_A = O_B
< case IsE.
Subgoal 1.2:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (plus E1 E2) VB O_B
Vars : vars (plus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 + I2 = I
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
intVal I = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.2:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Vars : vars (plus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
============================
intVal I = intVal I3 /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.2:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 + I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 + I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 + I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 + I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 + I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B O_A O_B Vars I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 + I5 = I
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply plus_integer_unique to EvA3 EvB2.
Subgoal 1.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 + I5 = I3
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.2:
Variables: FE EE_A EE_B O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 + I5 = I3
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_B = O_B
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (minus E1 E2) VB O_B
Vars : vars (minus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 - I2 = I
EvA4 : O1 ++ O2 = O_A
============================
intVal I = VB /\ O_A = O_B
< case IsE.
Subgoal 1.3:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (minus E1 E2) VB O_B
Vars : vars (minus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 - I2 = I
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
intVal I = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.3:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Vars : vars (minus E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
============================
intVal I = intVal I3 /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.3:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 - I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 - I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 - I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 - I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 - I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B O_A O_B Vars I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 - I5 = I
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply minus_integer_unique to EvA3 EvB2.
Subgoal 1.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 - I5 = I3
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.3:
Variables: FE EE_A EE_B O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 - I5 = I3
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_B = O_B
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (mult E1 E2) VB O_B
Vars : vars (mult E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 * I2 = I
EvA4 : O1 ++ O2 = O_A
============================
intVal I = VB /\ O_A = O_B
< case IsE.
Subgoal 1.4:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (mult E1 E2) VB O_B
Vars : vars (mult E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 * I2 = I
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
intVal I = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.4:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Vars : vars (mult E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
============================
intVal I = intVal I3 /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.4:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 * I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 * I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 * I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 * I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 * I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B O_A O_B Vars I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 * I5 = I
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply multiply_integer_unique to EvA3 EvB2.
Subgoal 1.4:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 * I5 = I3
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.4:
Variables: FE EE_A EE_B O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 * I5 = I3
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_B = O_B
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (div E1 E2) VB O_B
Vars : vars (div E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 / I2 = I
EvA4 : O1 ++ O2 = O_A
============================
intVal I = VB /\ O_A = O_B
< case IsE.
Subgoal 1.5:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 I E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (div E1 E2) VB O_B
Vars : vars (div E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 / I2 = I
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
intVal I = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.5:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Vars : vars (div E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
============================
intVal I = intVal I3 /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.5:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 / I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 / I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 / I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 / I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 I E2 E1 I4 O3 I5 O4 I3 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I4 / I2 = I
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B O_A O_B Vars I E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 / I5 = I
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I = intVal I3 /\ O_A = O_B
< apply divide_integer_unique to EvA3 EvB2.
Subgoal 1.5:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 / I5 = I3
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.5:
Variables: FE EE_A EE_B O_B Vars E2 E1 I4 O3 I5 O4 I3 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) O4 *
EvA3 : I4 / I5 = I3
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I4) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = O_B
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
intVal I3 = intVal I3 /\ O_B = O_B
< search.
Subgoal 1.6:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] @
EvB : evalExpr FE EE_B true VB O_B
Vars : vars true Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
trueVal = VB /\ [] = O_B
< case EvB.
Subgoal 1.6:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] @
Vars : vars true Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
trueVal = trueVal /\ [] = []
< search.
Subgoal 1.7:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] @
EvB : evalExpr FE EE_B false VB O_B
Vars : vars false Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
falseVal = VB /\ [] = O_B
< case EvB.
Subgoal 1.7:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] @
Vars : vars false Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
falseVal = falseVal /\ [] = []
< search.
Subgoal 1.8:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.8:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.8:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.8.1.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.8.1.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.8.1.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.8.1.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.8.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.8.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.8.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.8.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.8.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.8.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.8.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.8.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.8.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.9:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.9:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.9:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.9.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.9.2.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.9.2.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.9.2.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.9.2.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.9.2:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_B *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.9.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.9.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.9.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.9.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.9.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.10:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.10:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Vars : vars (and E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.10:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (and E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.10.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.10.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.10.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.10.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.10.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.10.3:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.10.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.10.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.10.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.10.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.10.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.10.3:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.11:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.11:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.11:
Variables: FE EE_A EE_B VB O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.11.1.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.11.1.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.11.1.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.11.1.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_B *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.11.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.11.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.11.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.11.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.11.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.11.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.11.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.11.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.11.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.11.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O1 O2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.12:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.12:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.12:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.12.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.12.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.12.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.12.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.12.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.12.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.12.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.12.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.12.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.12.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.12.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.12.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.12.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.13:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.13:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Vars : vars (or E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.13:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (or E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.13.3:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.13.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.13.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.13.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.13.3.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.13.3:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.13.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.13.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.13.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.13.3.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V1 V2 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.13.3:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.13.3:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.14:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Vars : vars (not E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.14:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Vars : vars (not E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.14:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.14.1:
Variables: FE EE_A EE_B O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.14.1:
Variables: FE EE_A EE_B O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.14.2:
Variables: FE EE_A EE_B O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 falseVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.15:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Vars : vars (not E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.15:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Vars : vars (not E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.15:
Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (not E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.15.1:
Variables: FE EE_A EE_B O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 falseVal O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.15.2:
Variables: FE EE_A EE_B O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.15.2:
Variables: FE EE_A EE_B O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 trueVal O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 trueVal O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.16:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Vars : vars (greater E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.16:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Vars : vars (greater E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.16:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.16.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.16.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.16.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.16.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.16.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.16.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.16.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.16.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.16.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.16.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.16.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.16.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.16.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.16.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.16.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.16.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< case EvA3.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
H3 : I4 < I3
============================
trueVal = falseVal /\ O_A = O_B
< apply less_lesseq_flip_false to _ EvB2.
Subgoal 1.17:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Vars : vars (greater E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.17:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Vars : vars (greater E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.17:
Variables: FE EE_A EE_B VB O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (greater E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.17.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.17.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.17.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.17.1.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.17.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.17.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.17.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.17.1.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< case EvB2.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB3 : O3 ++ O4 = O_B
H3 : I4 < I3
============================
falseVal = trueVal /\ O_A = O_B
< apply less_lesseq_flip_false to _ EvA3.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.17.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.17.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.17.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.17.2.1:
Variables: FE EE_A EE_B O_A O_B Vars I1 O1 I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.17.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.17.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.17.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.17.2.2:
Variables: FE EE_A EE_B O_A O_B Vars I2 O2 E2 E1 V1 V2 I3 O3 I4 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 I3 O3 I4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.18:
Variables: FE EE_A EE_B VB O_A O_B Vars V O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Vars : vars (eq E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
============================
trueVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.18:
Variables: FE EE_A EE_B VB O_A O_B Vars V O1 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Vars : vars (eq E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.18:
Variables: FE EE_A EE_B VB O_A O_B Vars V O1 O2 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
trueVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.18.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.18.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V4
============================
lookupScopes X EE_A V4
< M': apply mem_append_left to M Vars2.
Subgoal 1.18.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V4
M' : mem X Vars
============================
lookupScopes X EE_A V4
< apply Rel to M' L.
Subgoal 1.18.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V4
M' : mem X Vars
H3 : lookupScopes X EE_A V4
============================
lookupScopes X EE_A V4
< search.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.18.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.18.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V4
============================
lookupScopes X EE_A V4
< M': apply mem_append_right to M Vars2.
Subgoal 1.18.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V4
M' : mem X Vars
============================
lookupScopes X EE_A V4
< apply Rel to M' L.
Subgoal 1.18.1.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 O4 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V4
M' : mem X Vars
H3 : lookupScopes X EE_A V4
============================
lookupScopes X EE_A V4
< search.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O_B Vars E2 E1 V2 V3 V1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = O_B
============================
trueVal = trueVal /\ O_B = O_B
< search.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 V4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.18.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 V4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.18.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_left to M Vars2.
Subgoal 1.18.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.18.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V O1 O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 V4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.18.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 V4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.18.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_right to M Vars2.
Subgoal 1.18.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.18.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 E2 E1 V2 V3 V1 O3 V4 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V1 = V4 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V2 V3 O3 V4 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V4 O3 *
EvA2 : evalExpr FE EE_A E2 V4 O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvB : evalExpr FE EE_B E1 V4 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V4 = V4 -> false
EvB3 : O3 ++ O4 = O_B
============================
trueVal = falseVal /\ O_A = O_B
< apply EvB2 to _.
Subgoal 1.19:
Variables: FE EE_A EE_B VB O_A O_B Vars V1 O1 V2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Vars : vars (eq E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
============================
falseVal = VB /\ O_A = O_B
< case IsE.
Subgoal 1.19:
Variables: FE EE_A EE_B VB O_A O_B Vars V1 O1 V2 O2 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Vars : vars (eq E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.19:
Variables: FE EE_A EE_B VB O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (eq E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
falseVal = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.19.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.19.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_left to M Vars2.
Subgoal 1.19.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.19.1.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.19.1.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V4 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.19.1.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_right to M Vars2.
Subgoal 1.19.1.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.19.1.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V O3 O4 X V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V3 V4 V O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V O4 *
EvA3 : V = V -> false
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = O_B
============================
falseVal = trueVal /\ O_A = O_B
< apply EvA3 to _.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.19.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.19.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.19.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.19.2.1:
Variables: FE EE_A EE_B O_A O_B Vars V1 O1 V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V5 = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.19.2.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V5 = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V4 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.19.2.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V5 = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.19.2.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V5 = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.19.2.2:
Variables: FE EE_A EE_B O_A O_B Vars V2 O2 E2 E1 V3 V4 V5 O3 V6 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V5 = V2 -> false
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V6 O4 *
EvA3 : V5 = V6 -> false
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O_B Vars E2 E1 V3 V4 V5 O3 V6 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V6 O4 *
EvA3 : V5 = V6 -> false
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : V5 = V6 -> false
EvB3 : O3 ++ O4 = O_B
============================
falseVal = falseVal /\ O_B = O_B
< search.
Subgoal 1.20:
Variables: FE EE_A EE_B VB O_B Vars S
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) [] @
EvB : evalExpr FE EE_B (stringLit S) VB O_B
Vars : vars (stringLit S) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
stringVal S = VB /\ [] = O_B
< case EvB.
Subgoal 1.20:
Variables: FE EE_A EE_B Vars S
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) [] @
Vars : vars (stringLit S) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
stringVal S = stringVal S /\ [] = []
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B VB O_A O_B Vars S1 O1 S2 O2 S E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (appString E1 E2) VB O_B
Vars : vars (appString E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
============================
stringVal S = VB /\ O_A = O_B
< case IsE.
Subgoal 1.21:
Variables: FE EE_A EE_B VB O_A O_B Vars S1 O1 S2 O2 S E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (appString E1 E2) VB O_B
Vars : vars (appString E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
stringVal S = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.21:
Variables: FE EE_A EE_B VB O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (appString E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
============================
stringVal S = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.21:
Variables: FE EE_A EE_B O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
stringVal S = stringVal S3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars2.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O_A O_B Vars S1 O1 S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B O_A O_B Vars S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S4 ++ S2 = S
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
stringVal S = stringVal S3 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O_A O_B Vars S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S4 ++ S2 = S
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O_A O_B Vars S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S4 ++ S2 = S
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars2.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O_A O_B Vars S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S4 ++ S2 = S
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O_A O_B Vars S2 O2 S E2 E1 V1 V2 S4 O3 S5 O4 S3 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S4 ++ S2 = S
EvA4 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B O_A O_B Vars S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) O4 *
EvA3 : S4 ++ S5 = S
EvA4 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
stringVal S = stringVal S3 /\ O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 1.21:
Variables: FE EE_A EE_B O_B Vars S E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) O4 *
EvA3 : S4 ++ S5 = S
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
stringVal S = stringVal S3 /\ O_B = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.21:
Variables: FE EE_A EE_B O_B Vars E2 E1 V1 V2 S4 O3 S5 O4 S3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) O4 *
EvA3 : S4 ++ S5 = S3
EvA4 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V1
Vars1 : vars E2 V2
Vars2 : V1 ++ V2 = Vars
EvB : evalExpr FE EE_B E1 (stringVal S4) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = O_B
============================
stringVal S3 = stringVal S3 /\ O_B = O_B
< search.
Subgoal 1.22:
Variables: FE EE_A EE_B VA VB O_B Vars X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] @
EvB : evalExpr FE EE_B (name X) VB O_B
Vars : vars (name X) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookupScopes X EE_A VA
============================
VA = VB /\ [] = O_B
< case IsE.
Subgoal 1.22:
Variables: FE EE_A EE_B VA VB O_B Vars X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 [] @
EvB : evalExpr FE EE_B (name X) VB O_B
Vars : vars (name X) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookupScopes X EE_A VA
H1 : is_string X
============================
VA = VB /\ [] = O_B
< EvB: case EvB.
Subgoal 1.22:
Variables: FE EE_A EE_B VA VB Vars X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 [] @
Vars : vars (name X) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookupScopes X EE_A VA
H1 : is_string X
EvB : lookupScopes X EE_B VB
============================
VA = VB /\ [] = []
< case Vars.
Subgoal 1.22:
Variables: FE EE_A EE_B VA VB X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 [] @
Rel : forall X1 V,
mem X1 [X] -> lookupScopes X1 EE_B V -> lookupScopes X1 EE_A V
EvA1 : lookupScopes X EE_A VA
H1 : is_string X
EvB : lookupScopes X EE_B VB
============================
VA = VB /\ [] = []
< LA: apply Rel to _ EvB.
Subgoal 1.22:
Variables: FE EE_A EE_B VA VB X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 [] @
Rel : forall X1 V,
mem X1 [X] -> lookupScopes X1 EE_B V -> lookupScopes X1 EE_A V
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 EE_A EE_B VB X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 [] @
Rel : forall X1 V,
mem X1 [X] -> lookupScopes X1 EE_B V -> lookupScopes X1 EE_A V
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 O_A O_B Vars RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (call Fun Args) VB O_B
Vars : vars (call Fun Args) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = O_A
EvA6 : lookupScopes RetVar EE1 VA
============================
VA = VB /\ O_A = O_B
< case IsE.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (call Fun Args) VB O_B
Vars : vars (call Fun Args) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = O_A
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
============================
VA = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Vars : vars (call Fun Args) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = O_A
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
============================
VA = VB /\ O_A = O_B
< apply lookup_unique to EvA1 EvB.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Vars : vars (call Fun Args) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames1 ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv] Body1 EE1 O2 *
EvA5 : O1 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
============================
VA = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames1 ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv] Body1 EE1 O2 *
EvA5 : O1 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
============================
VA = VB /\ O_A = O_B
< apply IH_A to _ _ _ _ EvA2 EvB1 Vars _.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
============================
VA = VB /\ O_A = O_B
< apply zip_unique to EvA3 EvB2.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
============================
VA = VB /\ O_A = O_B
< apply evalArgs_isValue to _ _ _ EvA2.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
H3 : is_list is_value ArgVals1
============================
VA = VB /\ O_A = O_B
< IsFP: apply lookup_is_value_funCtx to _ EvA1.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 /\ O_A = O_B
< IsF: case IsFP.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 /\ O_A = O_B
< IsF: case IsF1.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 /\ O_A = O_B
< IsF: case IsF2.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 /\ O_A = O_B
< IsIE: apply zip_is to _ _ EvA3.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 /\ O_A = O_B
< NNS': apply newNameScopes_reflexive to _ with
EE = [].
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
============================
VA = VB /\ O_A = O_B
< NNS'': apply IH_C_S to _ _ _ _ EvA4 EvB3 NNS'1.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] Len EE1 EE2
============================
VA = VB /\ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvA4.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
VA = VB /\ O_A = O_B
< apply evalStmt_isCtx to _ _ _ EvB3.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] 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 /\ O_A = O_B
< LA: apply newNameScopes_lookupScopes to _ _ NNS'' EvB5.
Subgoal 1.23:
Variables: FE EE_A EE_B VA VB O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VB
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] 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
LA : lookupScopes RetVar1 EE1 VB
============================
VA = VB /\ O_A = O_B
< apply lookupScopes_unique to LA EvA6.
Subgoal 1.23:
Variables: FE EE_A EE_B VA O_A O_B Vars EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O2 *
EvA5 : O3 ++ O2 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VA
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] 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
LA : lookupScopes RetVar1 EE1 VA
============================
VA = VA /\ O_A = O_B
< apply IH_O_S to _ _ _ _ EvA4 EvB3 NNS'1.
Subgoal 1.23:
Variables: FE EE_A EE_B VA O_A O_B Vars EE1 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 *
EvA5 : O3 ++ O4 = O_A
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VA
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] 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
LA : lookupScopes RetVar1 EE1 VA
============================
VA = VA /\ O_A = O_B
< apply append_unique to EvA5 EvB4.
Subgoal 1.23:
Variables: FE EE_A EE_B VA O_B Vars EE1 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4 Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames1 ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE1 O4 *
EvA5 : O3 ++ O4 = O_B
EvA6 : lookupScopes RetVar1 EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = O_B
EvB5 : lookupScopes RetVar1 EE2 VA
Vars : varsArgs Args Vars
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 [] Len
NNS'1 : newNameScopes [] Len [] []
NNS'' : newNameScopes [] 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
LA : lookupScopes RetVar1 EE1 VA
============================
VA = VA /\ O_B = O_B
< search.
Subgoal 1.24:
Variables: FE EE_A EE_B VB O_A O_B Vars VF RF
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalExpr FE EE_B (recBuild RF) VB O_B
Vars : vars (recBuild RF) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalRecFields FE EE_A RF VF O_A *
============================
recVal VF = VB /\ O_A = O_B
< case IsE.
Subgoal 1.24:
Variables: FE EE_A EE_B VB O_A O_B Vars VF RF
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (recBuild RF) VB O_B
Vars : vars (recBuild RF) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalRecFields FE EE_A RF VF O_A *
H1 : is_recFieldExprs RF
============================
recVal VF = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.24:
Variables: FE EE_A EE_B VB O_A O_B Vars VF RF
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
EvB : evalExpr FE EE_B (recBuild RF) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalRecFields FE EE_A RF VF O_A *
H1 : is_recFieldExprs RF
Vars : varsRecFields RF Vars
============================
recVal VF = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.24:
Variables: FE EE_A EE_B O_A O_B Vars VF RF VF1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalRecFields FE EE_A RF VF O_A *
H1 : is_recFieldExprs RF
Vars : varsRecFields RF Vars
EvB : evalRecFields FE EE_B RF VF1 O_B
============================
recVal VF = recVal VF1 /\ O_A = O_B
< apply IH_RF to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.24:
Variables: FE EE_A EE_B O_B Vars RF VF1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalRecFields FE EE_A RF VF1 O_B *
H1 : is_recFieldExprs RF
Vars : varsRecFields RF Vars
EvB : evalRecFields FE EE_B RF VF1 O_B
============================
recVal VF1 = recVal VF1 /\ O_B = O_B
< search.
Subgoal 1.25:
Variables: FE EE_A EE_B VA VB O_A O_B Vars Fields F Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB O_B
Vars : vars (recFieldAccess Rec F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O_A *
EvA2 : lookupRecFieldVal Fields F VA
============================
VA = VB /\ O_A = O_B
< case IsE.
Subgoal 1.25:
Variables: FE EE_A EE_B VA VB O_A O_B Vars Fields F Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB O_B
Vars : vars (recFieldAccess Rec F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O_A *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
============================
VA = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.25:
Variables: FE EE_A EE_B VA VB O_A O_B Vars Fields F Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O_A *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
============================
VA = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.25:
Variables: FE EE_A EE_B VA VB O_A O_B Vars Fields F Rec Fields1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O_A *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
EvB : evalExpr FE EE_B Rec (recVal Fields1) O_B
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB _ _.
Subgoal 1.25:
Variables: FE EE_A EE_B VA VB O_B Vars F Rec Fields1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields1) O_B *
EvA2 : lookupRecFieldVal Fields1 F VA
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
EvB : evalExpr FE EE_B Rec (recVal Fields1) O_B
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VA = VB /\ O_B = O_B
< apply lookupRecFieldVal_unique to EvA2 EvB1.
Subgoal 1.25:
Variables: FE EE_A EE_B VB O_B Vars F Rec Fields1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair 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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A Rec (recVal Fields1) O_B *
EvA2 : lookupRecFieldVal Fields1 F VB
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
EvB : evalExpr FE EE_B Rec (recVal Fields1) O_B
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VB = VB /\ O_B = O_B
< search.
Subgoal 2.1:
Variables: FE EE_A EE_B EE_B' O_B N Len Scope
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 2.1:
Variables: FE EE_A EE_B N Len Scope
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 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 H T H1 T1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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)::Scope)::EE_A) 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 O_A *
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) 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 O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is2.
Subgoal 2.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) 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 O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< search.
Subgoal 2.3:
Variables: FE EE_A EE_B O_B N Len Scope X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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, V2)::Scope)::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V2 O_B *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_B = O_B
< search.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is1.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
============================
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 Scope V E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< search.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : replaceScopes X V2 (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_B = O_B
< search.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is2.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
============================
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 Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
============================
lookupScopes X (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V3
============================
lookupScopes X (Scope::EE_A) V3
< search.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_B = O_B
< search.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O4 *
EvA3 : O3 ++ O4 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Scope1 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O4 *
EvA3 : O3 ++ O4 = O_B
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'1 : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_B = O_B
< search.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 2.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O4 *
EvA3 : O3 ++ O4 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 2.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Scope1 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O4 *
EvA3 : O3 ++ O4 = O_B
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
O_B = O_B
< search.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
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 Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
============================
O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
============================
O_A = O_B
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2)
============================
O_A = O_B
< NNS'': case NNS''.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
< PA: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
============================
O_A = O_B
< PB: apply plus_integer_total to _ IsN2 with
N1 = 1.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
============================
O_A = O_B
< LenEEA++: assert length ([]::(Scope::EE_A)) N4.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
============================
O_A = O_B
< LenEEB++: assert length ([]::(Scope::EE_B)) N5.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
============================
O_A = O_B
< LenEE1+: apply evalStmt_keep_scopes to _ _ _ EvA2 LenEEA++.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
LenEE1+ : length (Scope1::EE1) N4
============================
O_A = O_B
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) N5
============================
O_A = O_B
< apply length_unique to LenEE2+ NNS''.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
============================
O_A = O_B
< LEq: apply newNameScopes_length to NNS' LenB.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
LEq : Len <= N3
============================
O_A = O_B
< L: apply lt_plus_one to PB _.
Subgoal 2.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
LEq : Len <= N3
L : N3 < Len
============================
O_A = O_B
< apply less_lesseq_flip_false to L LEq.
Subgoal 2.8.1.3:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : newNameScopes N Len EE1 EE2
============================
O_A = O_B
< NNS'': case NNS''.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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
< PB: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
============================
O_A = O_B
< LenEEB++: assert length ([]::(Scope::EE_B)) N3.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
============================
O_A = O_B
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2+ : length (Scope2::EE2) N3
============================
O_A = O_B
< LenEE2: case LenEE2+.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 N'
LenEE1 : 1 + N' = N3
============================
O_A = O_B
< apply length_unique to LenEE2 NNS''.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
============================
O_A = O_B
< apply length_is to LenEE2.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
============================
O_A = O_B
< apply plus_integer_unique_addend to _ _ _ PB LenEE1.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) Len
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
============================
O_A = O_B
< LenB': case LenB.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : 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 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : is_integer N'1
============================
O_A = O_B
< LEq: apply newNameScopes_length to NNS LenB'.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : is_integer N'1
LEq : Len <= N'1
============================
O_A = O_B
< L: apply lt_plus_one to LenB'1 _.
Subgoal 2.8.1.3.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O5 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O4 ++ O5 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : 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 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
============================
O_A = O_B
< apply IH_O_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
============================
O_A = O_B
< IsAR+: apply evalStmt_isCtx to _ _ _ EvA2.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
IsAR+ : is_list (is_list (is_pair is_string is_value)) (Scope2::(S1::AR))
============================
O_A = O_B
< case IsAR+.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
============================
O_A = O_B
< IsBR+: apply evalStmt_isCtx to _ _ _ EvB1.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : 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 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
============================
O_A = O_B
< apply IH_O_S to _ _ _ _ EvA3 EvB2 _.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
============================
O_A = O_B
< apply append_unique to EvA4 EvB3.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
============================
O_A = O_B
< apply append_unique to EvA5 EvB4.
Subgoal 2.8.1.3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O4 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
============================
O_B = O_B
< search.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O_A *
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.9.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.9.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.9.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.9.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.9.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.9.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.9.2:
Variables: FE EE_A EE_B O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_B *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
O_B = O_B
< search.
Subgoal 2.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 2.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Scope1 S1 Scope2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 2.11:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope I O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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) O1 *
EvA2 : O1 ++ [intVal I] = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.11:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope I O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.11:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope I O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.11:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope I O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.11.1.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.11.1.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.11.1.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.11.1.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.11.1.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V I1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope E V I1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I1) O2 *
EvA2 : O2 ++ [intVal I1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
============================
O_A = O_B
< apply append_unique to EvA2 EvB1.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O_B N Len Scope E V I1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I1) O2 *
EvA2 : O2 ++ [intVal I1] = O_B
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
============================
O_B = O_B
< search.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.12:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O1 *
EvA2 : O1 ++ [trueVal] = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.12:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.12:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.12:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.12.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.12.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.12.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.12.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.12.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.12.2.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.12.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O2 *
EvA2 : O2 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_A = O_B
< apply append_unique to EvA2 EvB1.
Subgoal 2.12.2:
Variables: FE EE_A EE_B O_B N Len Scope E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O2 *
EvA2 : O2 ++ [trueVal] = O_B
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_B = O_B
< search.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.13:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O1 *
EvA2 : O1 ++ [falseVal] = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.13:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.13:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.13:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.13.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.13.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.13.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.13.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.13.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.13.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.13.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O2 *
EvA2 : O2 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_A = O_B
< apply append_unique to EvA2 EvB1.
Subgoal 2.13.3:
Variables: FE EE_A EE_B O_B N Len Scope E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O2 *
EvA2 : O2 ++ [falseVal] = O_B
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_B = O_B
< search.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E V S1 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope S1 O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
============================
O_A = O_B
< Is: case IsS.
Subgoal 2.14:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope S1 O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
============================
O_A = O_B
< Vars: apply vars_exist to Is.
Subgoal 2.14:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope S1 O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
============================
O_A = O_B
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 2.14:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope S1 O1 E V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V I O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
============================
O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 2.14.4.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.14.4.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.14.4.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.14.4.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.14.4.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E V S2 O2 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope E V S2 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S2) O2 *
EvA2 : O2 ++ [stringVal S2] = O_A
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
============================
O_A = O_B
< apply append_unique to EvA2 EvB1.
Subgoal 2.14.4:
Variables: FE EE_A EE_B O_B N Len Scope E V S2 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S2) O2 *
EvA2 : O2 ++ [stringVal S2] = O_B
Is : is_expr E
Vars : vars E V
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
============================
O_B = O_B
< search.
Subgoal 3.1:
Variables: FE EE_A EE_B EE_B' O_B N Len Scope
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 3.1:
Variables: FE EE_A EE_B N Len Scope
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 3.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 S2 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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)::Scope)::EE_A) 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 O_A *
============================
newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
< Is: case IsS.
Subgoal 3.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) 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 O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
============================
newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
< Vars: apply vars_exist to Is2.
Subgoal 3.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) 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 O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
============================
newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.3:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope V X E Ty V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) 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 O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
newNameScopes N Len (((X, V)::Scope)::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
newNameScopes N Len (((X, V)::Scope)::EE_A) (((X, V2)::Scope)::EE_B)
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 3.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 3.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 3.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.3.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope V X E Ty V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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)::Scope)::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V O_A *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< search.
Subgoal 3.3:
Variables: FE EE_A EE_B O_B N Len Scope X E Ty V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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, V2)::Scope)::EE_A) O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E V2 O_B *
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
============================
newNameScopes N Len (((X, V2)::Scope)::EE_A) (((X, V2)::Scope)::EE_B)
< search.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
============================
newNameScopes N Len EE_A' EE_B'
< Is: case IsS.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
============================
newNameScopes N Len EE_A' EE_B'
< Vars: apply vars_exist to Is1.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
============================
newNameScopes N Len EE_A' EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
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 Scope V E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 3.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 3.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 3.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.4.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V E X V1 V2 X1 V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : replaceScopes X V (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V3
============================
lookupScopes X1 (Scope::EE_A) V3
< search.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : replaceScopes X V2 (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA1.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : replaceScopes X V2 (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
H1 : is_value V2
============================
newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS+ EvB1.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E X V1 V2 RA
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : replaceScopes X V2 (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
H1 : is_value V2
R : replaceScopes X V2 (Scope::EE_A) RA
R1 : newNameScopes N Len RA EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA2.
Subgoal 3.4:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope E X V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : replaceScopes X V2 (Scope::EE_A) EE_A'
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : replaceScopes X V2 (Scope::EE_B) EE_B'
H1 : is_value V2
R : replaceScopes X V2 (Scope::EE_A) EE_A'
R1 : newNameScopes N Len EE_A' EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< search.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
============================
newNameScopes N Len EE_A' EE_B'
< Is: case IsS.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
============================
newNameScopes N Len EE_A' EE_B'
< Vars: apply vars_exist to Is2.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
============================
newNameScopes N Len EE_A' EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
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 Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
============================
forall X V,
mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros M L.
Subgoal 3.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
============================
lookupScopes X (Scope::EE_A) V3
< apply vars_is to _ Vars.
Subgoal 3.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
============================
lookupScopes X (Scope::EE_A) V3
< apply mem_is_string to _ M.
Subgoal 3.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.5.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope V FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1 X V3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O_A *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V3
============================
lookupScopes X (Scope::EE_A) V3
< search.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA1.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
============================
newNameScopes N Len EE_A' EE_B'
< LA: apply newNameScopes_lookupScopes to _ _ NNS+ EvB1.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 FieldVals1 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals1)
EvB2 : updateRecFields Fields V2 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals1)
============================
newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_unique to LA EvA2.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
============================
newNameScopes N Len EE_A' EE_B'
< IsR: apply lookupScopes_is to _ EvA2.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR : is_value (recVal FieldVals)
IsR1 : is_string Rec
============================
newNameScopes N Len EE_A' EE_B'
< case IsR.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals NewVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR1 : is_string Rec
H2 : is_recFieldVals FieldVals
============================
newNameScopes N Len EE_A' EE_B'
< apply updateRecFields_unique to EvA3 EvB2.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR1 : is_string Rec
H2 : is_recFieldVals FieldVals
============================
newNameScopes N Len EE_A' EE_B'
< apply updateRecFields_is to _ _ _ EvB2.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR1 : is_string Rec
H2 : is_recFieldVals FieldVals
H3 : is_recFieldVals NewVals1
============================
newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS+ EvB3.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals E Fields Rec V1 V2 NewVals1 RA
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR1 : is_string Rec
H2 : is_recFieldVals FieldVals
H3 : is_recFieldVals NewVals1
R : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) RA
R1 : newNameScopes N Len RA EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA4.
Subgoal 3.5:
Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope FieldVals E Fields Rec V1 V2 NewVals1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 V2 O_B *
EvA2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
EvA3 : updateRecFields Fields V2 FieldVals NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) EE_A'
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) E V2 O_B
EvB1 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB2 : updateRecFields Fields V2 FieldVals NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) (Scope::EE_B) EE_B'
H1 : is_value V2
LA : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsR1 : is_string Rec
H2 : is_recFieldVals FieldVals
H3 : is_recFieldVals NewVals1
R : replaceScopes Rec (recVal NewVals1) (Scope::EE_A) EE_A'
R1 : newNameScopes N Len EE_A' EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< search.
Subgoal 3.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
============================
newNameScopes N Len EE_A' EE_B'
< Is: case IsS.
Subgoal 3.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
newNameScopes N Len EE_A' EE_B'
< Vars: apply vars_exist to Is.
Subgoal 3.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
newNameScopes N Len EE_A' EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.6:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
newNameScopes N Len EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.6.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 3.6.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'' : newNameScopes N Len (Scope1::EE_A') (Scope2::EE_B')
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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'
< LEq: apply newNameScopes_length to NNS LenB'.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
============================
newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
============================
newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEEB++: assert length ([]::(Scope::EE_B)) N3.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEE_B'+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
============================
newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
============================
newNameScopes N Len EE_A' EE_B'
< L': apply lt_plus_one to LenB'1 _.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
L' : N' < N2
============================
newNameScopes N Len EE_A' EE_B'
< L'': apply less_integer_transitive to L' L.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
L' : N' < N2
L'' : N' < N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_unique to NNS'' LenEE_B'+.
Subgoal 3.6.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N N3 (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
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'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : 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 3.6.1.3:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope2::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'' : newNameScopes N Len EE_A' EE_B'
============================
newNameScopes N Len EE_A' EE_B'
< search.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.6.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Th (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
============================
newNameScopes N Len EE_A' EE_B'
< Is: case IsS.
Subgoal 3.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
newNameScopes N Len EE_A' EE_B'
< Vars: apply vars_exist to Is.
Subgoal 3.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
newNameScopes N Len EE_A' EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.7:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
newNameScopes N Len EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.7.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Th (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.7.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 O2 El Th Cond V O3 Scope2 O4 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': apply IH_C_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 3.7.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
NNS'' : newNameScopes N Len (Scope1::EE_A') (Scope2::EE_B')
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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'
< LEq: apply newNameScopes_length to NNS LenB'.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
============================
newNameScopes N Len EE_A' EE_B'
< IsN1: apply length_is to LenB.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
============================
newNameScopes N Len EE_A' EE_B'
< P: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEEB++: assert length ([]::(Scope::EE_B)) N3.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEE_B'+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
============================
newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to P _.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_is to LenB'.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
============================
newNameScopes N Len EE_A' EE_B'
< L': apply lt_plus_one to LenB'1 _.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
L' : N' < N2
============================
newNameScopes N Len EE_A' EE_B'
< L'': apply less_integer_transitive to L' L.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = 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
LEq : Len <= N'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : is_integer N'
L' : N' < N2
L'' : N' < N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_unique to NNS'' LenEE_B'+.
Subgoal 3.7.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Scope Scope1 O2 El Th Cond V O3 Scope2 O4 N1 SNames BNames N2 N' N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope1::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N N3 (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
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'
IsN1 : is_integer N2
P : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE_B'+ : length (Scope2::EE_B') N3
L : N2 < N3
H1 : 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 3.7.2.3:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 El Th Cond V O3 Scope2 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O3 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) El (Scope2::EE_A') O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O3
EvB1 : evalStmt FE ([]::(Scope::EE_B)) El (Scope2::EE_B') O4
EvB2 : O3 ++ O4 = O_B
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 EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
============================
newNameScopes N Len EE_A' EE_B'
< Is: case IsS.
Subgoal 3.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
============================
newNameScopes N Len EE_A' EE_B'
< Vars: apply vars_exist to Is.
Subgoal 3.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
newNameScopes N Len EE_A' EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.8:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
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 Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (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_S to _ _ _ _ EvA2 EvB1 _.
Subgoal 3.8.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : newNameScopes N Len (Scope1::EE1) (Scope2::EE2)
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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'
< PA: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
============================
newNameScopes N Len EE_A' EE_B'
< PB: apply plus_integer_total to _ IsN2 with
N1 = 1.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
============================
newNameScopes N Len EE_A' EE_B'
< LenEEA++: assert length ([]::(Scope::EE_A)) N4.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
============================
newNameScopes N Len EE_A' EE_B'
< LenEEB++: assert length ([]::(Scope::EE_B)) N5.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
============================
newNameScopes N Len EE_A' EE_B'
< LenEE1+: apply evalStmt_keep_scopes to _ _ _ EvA2 LenEEA++.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
LenEE1+ : length (Scope1::EE1) N4
============================
newNameScopes N Len EE_A' EE_B'
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4 N5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = N5
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) N5
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) N5
============================
newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE2+ NNS''.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
============================
newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS+ LenB.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
LEq : Len <= N3
============================
newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to PB _.
Subgoal 3.8.1.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length (Scope2::EE2) Len
NNS''1 : drop N1 (Scope1::EE1) (Scope2::EE2)
NNS''2 : take N1 (Scope1::EE1) N
NNS''3 : names N SNames
NNS''4 : names (Scope2::EE2) 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
PA : 1 + N2 = N4
PB : 1 + N3 = Len
LenEEA++ : length ([]::(Scope::EE_A)) N4
LenEEB++ : length ([]::(Scope::EE_B)) Len
LenEE1+ : length (Scope1::EE1) N4
LenEE2+ : length (Scope2::EE2) Len
LEq : Len <= N3
L : N3 < Len
============================
newNameScopes N Len EE_A' EE_B'
< apply less_lesseq_flip_false to L LEq.
Subgoal 3.8.1.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : newNameScopes N Len EE1 EE2
============================
newNameScopes N Len EE_A' EE_B'
< NNS'': case NNS''.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 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'
< PB: apply plus_integer_total to _ IsN1 with
N1 = 1.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEEB++: assert length ([]::(Scope::EE_B)) N3.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB1 LenEEB++.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2+ : length (Scope2::EE2) N3
============================
newNameScopes N Len EE_A' EE_B'
< LenEE2: case LenEE2+.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3 N'
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 N'
LenEE1 : 1 + N' = N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_unique to LenEE2 NNS''.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
============================
newNameScopes N Len EE_A' EE_B'
< apply length_is to LenEE2.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) N2
IsN1 : is_integer N2
PB : 1 + N2 = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
============================
newNameScopes N Len EE_A' EE_B'
< apply plus_integer_unique_addend to _ _ _ PB LenEE1.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length (Scope::EE_B) Len
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
============================
newNameScopes N Len EE_A' EE_B'
< LenB': case LenB.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : 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 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : is_integer N'1
============================
newNameScopes N Len EE_A' EE_B'
< LEq: apply newNameScopes_length to NNS LenB'.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : is_integer N'1
LEq : Len <= N'1
============================
newNameScopes N Len EE_A' EE_B'
< L: apply lt_plus_one to LenB'1 _.
Subgoal 3.8.1.2.1:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 EE1 O2 O3 O12 Body Cond V O4 Scope2 EE2 O5 O6 O7 N1 SNames BNames N3 N'1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope2::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope2::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = O_B
NNS'' : length EE2 Len
NNS''1 : drop N1 EE1 EE2
NNS''2 : take N1 EE1 N
NNS''3 : names N SNames
NNS''4 : names EE2 BNames
NNS''5 : forall X, mem X SNames -> mem X BNames -> false
IsN1 : is_integer Len
PB : 1 + Len = N3
LenEEB++ : length ([]::(Scope::EE_B)) N3
LenEE2 : length EE2 Len
LenEE1 : 1 + Len = N3
H1 : is_integer Len
LenB' : length EE_B N'1
LenB'1 : 1 + N'1 = Len
H2 : 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 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
============================
newNameScopes N Len EE_A' EE_B'
< IsAR+: apply evalStmt_isCtx to _ _ _ EvA2.
Subgoal 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 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 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : 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 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : 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 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : 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 3.8.1.2.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 O3 O12 Body Cond V O4 Scope2 O5 O6 O7 BR S1 AR
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) 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
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O4
EvB1 : evalStmt FE ([]::(Scope::EE_B)) 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 AR BR
H1 : is_list (is_pair is_string is_value) Scope2
H2 : is_list (is_list (is_pair is_string is_value)) (S1::AR)
H3 : is_list (is_pair is_string is_value) Scope2
H4 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H5 : 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' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
newNameScopes N Len EE_A' (Scope::EE_B)
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.8.2:
Variables: FE EE_A EE_B EE_A' O_A O_B N Len Scope O1 Scope1 EE1 O2 O3 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 O1 *
EvA2 : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = O_A
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O_A *
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< Is: case IsS.
Subgoal 3.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< Vars: apply vars_exist to Is.
Subgoal 3.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< NNS+: assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).
Subgoal 3.9:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::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 O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS+ L.
Subgoal 3.9.1:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope Body Cond V O1 Scope1 EE1 O2 O3 O12 X V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond trueVal O1
EvB1 : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = O_B
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 3.9.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope Body Cond V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) Cond falseVal O_A *
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB : evalExpr FE (Scope::EE_B) Cond falseVal O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 3.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.10:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Scope1 S1 Scope2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.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_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.10.2:
Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope S1 Scope2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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 3.11:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope I O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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) O1 *
EvA2 : O1 ++ [intVal I] = O_A
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.11.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E I1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
EvB : evalExpr FE (Scope::EE_B) E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.11.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.11.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.11.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope I O1 E S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (intVal I) O1 *
EvA2 : O1 ++ [intVal I] = O_A
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.12:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O1 *
EvA2 : O1 ++ [trueVal] = O_A
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.12.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.12.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.12.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.12.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal O1 *
EvA2 : O1 ++ [trueVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.13:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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 O1 *
EvA2 : O1 ++ [falseVal] = O_A
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.13.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.13.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.13.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.13.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope O1 E S1 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E falseVal O1 *
EvA2 : O1 ++ [falseVal] = O_A
EvB : evalExpr FE (Scope::EE_B) E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.14:
Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope S1 O1 E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::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) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
============================
newNameScopes N Len (Scope::EE_A) EE_B'
< EvB: case EvB.
Subgoal 3.14.1:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E I O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
EvB : evalExpr FE (Scope::EE_B) E (intVal I) O2
EvB1 : O2 ++ [intVal I] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.14.2:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
EvB : evalExpr FE (Scope::EE_B) E trueVal O2
EvB1 : O2 ++ [trueVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.14.3:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
EvB : evalExpr FE (Scope::EE_B) E falseVal O2
EvB1 : O2 ++ [falseVal] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 3.14.4:
Variables: FE EE_A EE_B O_A O_B N Len Scope S1 O1 E S2 O2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (Scope::EE_A) O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E (stringVal S1) O1 *
EvA2 : O1 ++ [stringVal S1] = O_A
EvB : evalExpr FE (Scope::EE_B) E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = O_B
============================
newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
< search.
Subgoal 4.1:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] [] @
EvB : evalArgs FE EE_B nilArgs VB O_B
Vars : varsArgs nilArgs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
[] = VB /\ [] = O_B
< EvA: case EvA (keep).
Subgoal 4.1:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] [] @
EvB : evalArgs FE EE_B nilArgs VB O_B
Vars : varsArgs nilArgs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
[] = VB /\ [] = O_B
< case EvB.
Subgoal 4.1:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 [] [] @
Vars : varsArgs nilArgs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
[] = [] /\ [] = []
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V Rest E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) O_A @
EvB : evalArgs FE EE_B (consArgs E Rest) VB O_B
Vars : varsArgs (consArgs E Rest) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
============================
V::VRest = VB /\ O_A = O_B
< Is: case IsA.
Subgoal 4.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V Rest E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
EvB : evalArgs FE EE_B (consArgs E Rest) VB O_B
Vars : varsArgs (consArgs E Rest) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
============================
V::VRest = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 4.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V Rest E VE VRest1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
EvB : evalArgs FE EE_B (consArgs E Rest) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
V::VRest = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 4.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
V::VRest = V1::VRest2 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X VE -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_left to M Vars2.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
H1 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
V1::VRest = V1::VRest2 /\ O_A = O_B
< apply IH_A to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X VRest1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_right to M Vars2.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
H1 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B O_A O_B Vars Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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::VRest2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest2 O4 *
EvA3 : O3 ++ O4 = O_A
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
V1::VRest2 = V1::VRest2 /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 4.2:
Variables: FE EE_A EE_B O_B Vars Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
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::VRest2) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest2 O4 *
EvA3 : O3 ++ O4 = O_B
Is : is_expr E
Is1 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
V1::VRest2 = V1::VRest2 /\ O_B = O_B
< search.
Subgoal 5.1:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 nilRecFieldVals [] @
EvB : evalRecFields FE EE_B nilRecFieldExprs VB O_B
Vars : varsRecFields nilRecFieldExprs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
nilRecFieldVals = VB /\ [] = O_B
< EvA: case EvA (keep).
Subgoal 5.1:
Variables: FE EE_A EE_B VB O_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 nilRecFieldVals [] @
EvB : evalRecFields FE EE_B nilRecFieldExprs VB O_B
Vars : varsRecFields nilRecFieldExprs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
nilRecFieldVals = VB /\ [] = O_B
< case EvB.
Subgoal 5.1:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 nilRecFieldVals [] @
Vars : varsRecFields nilRecFieldExprs Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
nilRecFieldVals = nilRecFieldVals /\ [] = []
< search.
Subgoal 5.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V F Rest E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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) (consRecFieldVals F V VRest) O_A @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB O_B
Vars : varsRecFields (consRecFieldExprs F E Rest) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
============================
consRecFieldVals F V VRest = VB /\ O_A = O_B
< Is: case IsRF.
Subgoal 5.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V F Rest E
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB O_B
Vars : varsRecFields (consRecFieldExprs F E Rest) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
============================
consRecFieldVals F V VRest = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 5.2:
Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
consRecFieldVals F V VRest = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 5.2:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
consRecFieldVals F V VRest = consRecFieldVals F V1 VRest2 /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 5.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X VE -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 5.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_left to M Vars2.
Subgoal 5.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 5.2.1:
Variables: FE EE_A EE_B O_A O_B Vars O1 O2 VRest V F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
H1 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 5.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
consRecFieldVals F V1 VRest = consRecFieldVals F V1 VRest2 /\ O_A = O_B
< apply IH_RF to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 5.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X VRest1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 5.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_right to M Vars2.
Subgoal 5.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 5.2.2:
Variables: FE EE_A EE_B O_A O_B Vars O2 VRest F Rest E VE VRest1 O3 O4 VRest2 V1 X V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
H1 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 5.2:
Variables: FE EE_A EE_B O_A O_B Vars F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest2 O4 *
EvA3 : O3 ++ O4 = O_A
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
consRecFieldVals F V1 VRest2 = consRecFieldVals F V1 VRest2 /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 5.2:
Variables: FE EE_A EE_B O_B Vars F Rest E VE VRest1 O3 O4 VRest2 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (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) (consRecFieldVals F V1 VRest2) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest2 O4 *
EvA3 : O3 ++ O4 = O_B
Is : is_string F
Is1 : is_expr E
Is2 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest2 O4
EvB2 : O3 ++ O4 = O_B
============================
consRecFieldVals F V1 VRest2 = consRecFieldVals F V1 VRest2 /\ O_B = O_B
< search.
Proof completed.
< Theorem evalExpr_unique :
forall FE EE E VA OA VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalExpr FE EE E VB OB -> VA = VB /\ OA = OB.
============================
forall FE EE E VA OA VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalExpr FE EE E VB OB -> VA = VB /\ OA = OB
< intros IsE IsFE IsEE EvA EvB.
Variables: FE EE E VA OA VB 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 OA
EvB : evalExpr FE EE E VB OB
============================
VA = VB /\ OA = OB
< Vars: apply vars_exist to IsE.
Variables: FE EE E VA OA VB OB V
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 OA
EvB : evalExpr FE EE E VB OB
Vars : vars E V
============================
VA = VB /\ OA = OB
< apply evalExpr_rel to _ _ _ _ EvA EvB Vars _.
Variables: FE EE E VB OB V
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 OB
EvB : evalExpr FE EE E VB OB
Vars : vars E V
============================
VB = VB /\ 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 OA VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalArgs FE EE A VB OB -> VA = VB /\ OA = OB.
============================
forall FE EE A VA OA VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalArgs FE EE A VB OB -> VA = VB /\ OA = OB
< intros IsA IsFE IsEE EvA EvB.
Variables: FE EE A VA OA VB 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
IsEE : is_list (is_list (is_pair is_string is_value)) EE
EvA : evalArgs FE EE A VA OA
EvB : evalArgs FE EE A VB OB
============================
VA = VB /\ OA = OB
< Vars: apply varsArgs_exist to IsA.
Variables: FE EE A VA OA VB OB V
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
EvA : evalArgs FE EE A VA OA
EvB : evalArgs FE EE A VB OB
Vars : varsArgs A V
============================
VA = VB /\ OA = OB
< apply evalArgs_rel to _ _ _ _ EvA EvB Vars _.
Variables: FE EE A VB OB V
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
EvA : evalArgs FE EE A VB OB
EvB : evalArgs FE EE A VB OB
Vars : varsArgs A V
============================
VB = VB /\ OB = OB
< search.
Proof completed.
< Theorem evalRecFields_unique :
forall FE EE RF VA OA VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalRecFields FE EE RF VB OB -> VA = VB /\ OA = OB.
============================
forall FE EE RF VA OA VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 OA ->
evalRecFields FE EE RF VB OB -> VA = VB /\ OA = OB
< intros IsRF IsFE IsEE EvA EvB.
Variables: FE EE RF VA OA VB 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
IsEE : is_list (is_list (is_pair is_string is_value)) EE
EvA : evalRecFields FE EE RF VA OA
EvB : evalRecFields FE EE RF VB OB
============================
VA = VB /\ OA = OB
< Vars: apply varsRecFields_exist to IsRF.
Variables: FE EE RF VA OA VB OB V
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
EvA : evalRecFields FE EE RF VA OA
EvB : evalRecFields FE EE RF VB OB
Vars : varsRecFields RF V
============================
VA = VB /\ OA = OB
< apply evalRecFields_rel to _ _ _ _ EvA EvB Vars _.
Variables: FE EE RF VB OB V
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
EvA : evalRecFields FE EE RF VB OB
EvB : evalRecFields FE EE RF VB OB
Vars : varsRecFields RF V
============================
VB = VB /\ OB = OB
< search.
Proof completed.
< Extensible_Theorem
evalExpr_rel_exists_ES : forall FE EE_A EE_B E V O ES Vars,
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 O ES ->
Vars : vars E Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
<evalExpr {ES}> FE EE_A E V 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_rel_exists_ES : forall FE EE_A EE_B A V O ES Vars,
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 O ES ->
Vars : varsArgs A Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
<evalArgs {ES}> FE EE_A A V O ES
on EvB as IH_A,
evalRecFields_rel_exists_ES : forall FE EE_A EE_B RF V O ES Vars,
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 O ES ->
Vars : varsRecFields RF Vars ->
Rel : (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) ->
<evalRecFields {ES}> FE EE_A RF V O ES
on EvB as IH_RF.
Subgoal 1.1:
Variables: FE EE_A EE_B Vars I
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) [] 0 @
Vars : vars (num I) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalExpr {ES}> FE EE_A (num I) (intVal I) [] 0
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (plus E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) O ES
< case IsE.
Subgoal 1.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (plus E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) O ES
< Vars: case Vars.
Subgoal 1.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 + I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (plus E1 E2) (intVal I) O ES
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (minus E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) O ES
< case IsE.
Subgoal 1.3:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (minus E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) O ES
< Vars: case Vars.
Subgoal 1.3:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.3.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.3:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 - I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (minus E1 E2) (intVal I) O ES
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (mult E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) O ES
< case IsE.
Subgoal 1.4:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (mult E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) O ES
< Vars: case Vars.
Subgoal 1.4:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.4.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.4:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 * I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (mult E1 E2) (intVal I) O ES
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (div E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) O ES
< case IsE.
Subgoal 1.5:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (div E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) O ES
< Vars: case Vars.
Subgoal 1.5:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.5.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.5.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.5:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 I E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 / I2 = I
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (div E1 E2) (intVal I) O ES
< search.
Subgoal 1.6:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 [] 0 @
Vars : vars true Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalExpr {ES}> FE EE_A true trueVal [] 0
< search.
Subgoal 1.7:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 [] 0 @
Vars : vars false Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalExpr {ES}> FE EE_A false falseVal [] 0
< search.
Subgoal 1.8:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (and E1 E2) trueVal O ES
< case IsE.
Subgoal 1.8:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (and E1 E2) trueVal O ES
< Vars: case Vars.
Subgoal 1.8:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (and E1 E2) trueVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.8.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.8:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
============================
<evalExpr {ES}> FE EE_A (and E1 E2) trueVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.8.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.8:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 trueVal O3 N1
============================
<evalExpr {ES}> FE EE_A (and E1 E2) trueVal O ES
< search.
Subgoal 1.9:
Variables: FE EE_A EE_B O ES Vars E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< case IsE.
Subgoal 1.9:
Variables: FE EE_A EE_B O ES Vars E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< Vars: case Vars.
Subgoal 1.9:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = EE_A.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.9.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.9:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
H3 : <evalExpr {ES}> FE EE_A E1 falseVal O ES
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< search.
Subgoal 1.10:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< case IsE.
Subgoal 1.10:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (and E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< Vars: case Vars.
Subgoal 1.10:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.10.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.10:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.10.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.10:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 trueVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 trueVal O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 falseVal O3 N1
============================
<evalExpr {ES}> FE EE_A (and E1 E2) falseVal O ES
< search.
Subgoal 1.11:
Variables: FE EE_A EE_B O ES Vars E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< case IsE.
Subgoal 1.11:
Variables: FE EE_A EE_B O ES Vars E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< Vars: case Vars.
Subgoal 1.11:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = EE_A.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.11.1:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.11:
Variables: FE EE_A EE_B O ES Vars E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
H3 : <evalExpr {ES}> FE EE_A E1 trueVal O ES
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< search.
Subgoal 1.12:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< case IsE.
Subgoal 1.12:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< Vars: case Vars.
Subgoal 1.12:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.12.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.12:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.12.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.12:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 trueVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 trueVal O3 N1
============================
<evalExpr {ES}> FE EE_A (or E1 E2) trueVal O ES
< search.
Subgoal 1.13:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (or E1 E2) falseVal O ES
< case IsE.
Subgoal 1.13:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (or E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (or E1 E2) falseVal O ES
< Vars: case Vars.
Subgoal 1.13:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (or E1 E2) falseVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.13.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.13:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
============================
<evalExpr {ES}> FE EE_A (or E1 E2) falseVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.13.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.13:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 falseVal O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 falseVal O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 falseVal O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 falseVal O3 N1
============================
<evalExpr {ES}> FE EE_A (or E1 E2) falseVal O ES
< search.
Subgoal 1.14:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (not E1) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
============================
<evalExpr {ES}> FE EE_A (not E1) trueVal O ES
< case IsE.
Subgoal 1.14:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (not E1) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
============================
<evalExpr {ES}> FE EE_A (not E1) trueVal O ES
< Vars: case Vars.
Subgoal 1.14:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
Vars : vars E1 Vars
============================
<evalExpr {ES}> FE EE_A (not E1) trueVal O ES
< apply IH_E to _ _ _ _ EvB1 Vars Rel.
Subgoal 1.14:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 falseVal O ES *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 falseVal O ES
============================
<evalExpr {ES}> FE EE_A (not E1) trueVal O ES
< search.
Subgoal 1.15:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (not E1) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
============================
<evalExpr {ES}> FE EE_A (not E1) falseVal O ES
< case IsE.
Subgoal 1.15:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (not E1) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
============================
<evalExpr {ES}> FE EE_A (not E1) falseVal O ES
< Vars: case Vars.
Subgoal 1.15:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
Vars : vars E1 Vars
============================
<evalExpr {ES}> FE EE_A (not E1) falseVal O ES
< apply IH_E to _ _ _ _ EvB1 Vars Rel.
Subgoal 1.15:
Variables: FE EE_A EE_B O ES Vars E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B E1 trueVal O ES *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 trueVal O ES
============================
<evalExpr {ES}> FE EE_A (not E1) falseVal O ES
< search.
Subgoal 1.16:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (greater E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) trueVal O ES
< case IsE.
Subgoal 1.16:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (greater E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) trueVal O ES
< Vars: case Vars.
Subgoal 1.16:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) trueVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.16.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.16:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) trueVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.16.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.16:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 > I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) trueVal O ES
< search.
Subgoal 1.17:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (greater E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) falseVal O ES
< case IsE.
Subgoal 1.17:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (greater E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) falseVal O ES
< Vars: case Vars.
Subgoal 1.17:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) falseVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.17.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.17:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) falseVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.17.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.17:
Variables: FE EE_A EE_B O ES Vars N2 N1 I1 O2 I2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (intVal I1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (intVal I2) O3 N1 *
EvB4 : I1 <= I2
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (intVal I1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (intVal I2) O3 N1
============================
<evalExpr {ES}> FE EE_A (greater E1 E2) falseVal O ES
< search.
Subgoal 1.18:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (eq E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) trueVal O ES
< case IsE.
Subgoal 1.18:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (eq E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) trueVal O ES
< Vars: case Vars.
Subgoal 1.18:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) trueVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V4
============================
lookupScopes X EE_A V4
< M': apply mem_append_left to M Vars2.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V4
M' : mem X Vars
============================
lookupScopes X EE_A V4
< apply Rel to M' L.
Subgoal 1.18.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V4
M' : mem X Vars
H3 : lookupScopes X EE_A V4
============================
lookupScopes X EE_A V4
< search.
Subgoal 1.18:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) trueVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V3
L : lookupScopes X EE_B V4
============================
lookupScopes X EE_A V4
< M': apply mem_append_right to M Vars2.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V3
L : lookupScopes X EE_B V4
M' : mem X Vars
============================
lookupScopes X EE_A V4
< apply Rel to M' L.
Subgoal 1.18.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3 X V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V3
L : lookupScopes X EE_B V4
M' : mem X Vars
H3 : lookupScopes X EE_A V4
============================
lookupScopes X EE_A V4
< search.
Subgoal 1.18:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 O3 E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V1 O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 V1 O3 N1
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) trueVal O ES
< search.
Subgoal 1.19:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (eq E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) falseVal O ES
< case IsE.
Subgoal 1.19:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (eq E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) falseVal O ES
< Vars: case Vars.
Subgoal 1.19:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) falseVal O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_left to M Vars2.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.19.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.19:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) falseVal O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
forall X V1, mem X V4 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
============================
lookupScopes X EE_A V5
< M': apply mem_append_right to M Vars2.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
lookupScopes X EE_A V5
< apply Rel to M' L.
Subgoal 1.19.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
lookupScopes X EE_A V5
< search.
Subgoal 1.19:
Variables: FE EE_A EE_B O ES Vars N2 N1 V1 O2 V2 O3 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB4 : V1 = V2 -> false
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 V2 O3 N1
============================
<evalExpr {ES}> FE EE_A (eq E1 E2) falseVal O ES
< search.
Subgoal 1.20:
Variables: FE EE_A EE_B Vars S
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) [] 0 @
Vars : vars (stringLit S) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalExpr {ES}> FE EE_A (stringLit S) (stringVal S) [] 0
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (appString E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) O ES
< case IsE.
Subgoal 1.21:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (appString E1 E2) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) O ES
< Vars: case Vars.
Subgoal 1.21:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
<evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars2.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.21.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
============================
<evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) O ES
< EvA2: apply IH_E to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars2.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.21.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.21:
Variables: FE EE_A EE_B O ES Vars N2 N1 S1 O2 S2 O3 S E2 E1 V2 V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (stringVal S1) O2 N2 *
EvB3 : <evalExpr {ES}> FE EE_B E2 (stringVal S2) O3 N1 *
EvB4 : S1 ++ S2 = S
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V2
Vars1 : vars E2 V3
Vars2 : V2 ++ V3 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 (stringVal S1) O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 (stringVal S2) O3 N1
============================
<evalExpr {ES}> FE EE_A (appString E1 E2) (stringVal S) O ES
< search.
Subgoal 1.22:
Variables: FE EE_A EE_B V Vars X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 [] 0 @
Vars : vars (name X) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : lookupScopes X EE_B V
============================
<evalExpr {ES}> FE EE_A (name X) V [] 0
< case IsE.
Subgoal 1.22:
Variables: FE EE_A EE_B V Vars X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 [] 0 @
Vars : vars (name X) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : lookupScopes X EE_B V
H1 : is_string X
============================
<evalExpr {ES}> FE EE_A (name X) V [] 0
< case Vars.
Subgoal 1.22:
Variables: FE EE_A EE_B V X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 [] 0 @
Rel : forall X1 V1,
mem X1 [X] -> lookupScopes X1 EE_B V1 -> lookupScopes X1 EE_A V1
EvB1 : lookupScopes X EE_B V
H1 : is_string X
============================
<evalExpr {ES}> FE EE_A (name X) V [] 0
< apply Rel to _ EvB1.
Subgoal 1.22:
Variables: FE EE_A EE_B V X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 [] 0 @
Rel : forall X1 V1,
mem X1 [X] -> lookupScopes X1 EE_B V1 -> lookupScopes X1 EE_A V1
EvB1 : lookupScopes X EE_B V
H1 : is_string X
H2 : lookupScopes X EE_A V
============================
<evalExpr {ES}> FE EE_A (name X) V [] 0
< search.
Subgoal 1.23:
Variables: FE EE_A EE_B V O ES Vars N2 N1 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (call Fun Args) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals O2 N2 *
EvB4 : zip ArgNames ArgVals InitEnv
EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 N1 *
EvB6 : O2 ++ O3 = O
EvB7 : lookupScopes RetVar EE1 V
============================
<evalExpr {ES}> FE EE_A (call Fun Args) V O ES
< case IsE.
Subgoal 1.23:
Variables: FE EE_A EE_B V O ES Vars N2 N1 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (call Fun Args) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals O2 N2 *
EvB4 : zip ArgNames ArgVals InitEnv
EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 N1 *
EvB6 : O2 ++ O3 = O
EvB7 : lookupScopes RetVar EE1 V
H1 : is_string Fun
H2 : is_args Args
============================
<evalExpr {ES}> FE EE_A (call Fun Args) V O ES
< Vars: case Vars.
Subgoal 1.23:
Variables: FE EE_A EE_B V O ES Vars N2 N1 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals O2 N2 *
EvB4 : zip ArgNames ArgVals InitEnv
EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 N1 *
EvB6 : O2 ++ O3 = O
EvB7 : lookupScopes RetVar EE1 V
H1 : is_string Fun
H2 : is_args Args
Vars : varsArgs Args Vars
============================
<evalExpr {ES}> FE EE_A (call Fun Args) V O ES
< EvA2: apply IH_A to _ _ _ _ EvB3 Vars Rel.
Subgoal 1.23:
Variables: FE EE_A EE_B V O ES Vars N2 N1 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB3 : <evalArgs {ES}> FE EE_B Args ArgVals O2 N2 *
EvB4 : zip ArgNames ArgVals InitEnv
EvB5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 N1 *
EvB6 : O2 ++ O3 = O
EvB7 : lookupScopes RetVar EE1 V
H1 : is_string Fun
H2 : is_args Args
Vars : varsArgs Args Vars
EvA2 : <evalArgs {ES}> FE EE_A Args ArgVals O2 N2
============================
<evalExpr {ES}> FE EE_A (call Fun Args) V O ES
< search.
Subgoal 1.24:
Variables: FE EE_A EE_B O ES Vars VF RF
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : vars (recBuild RF) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalRecFields {ES}> FE EE_B RF VF O ES *
============================
<evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) O ES
< case IsE.
Subgoal 1.24:
Variables: FE EE_A EE_B O ES Vars VF RF
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Vars : vars (recBuild RF) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalRecFields {ES}> FE EE_B RF VF O ES *
H1 : is_recFieldExprs RF
============================
<evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) O ES
< Vars: case Vars.
Subgoal 1.24:
Variables: FE EE_A EE_B O ES Vars VF RF
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalRecFields {ES}> FE EE_B RF VF O ES *
H1 : is_recFieldExprs RF
Vars : varsRecFields RF Vars
============================
<evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) O ES
< apply IH_RF to _ _ _ _ EvB1 Vars Rel.
Subgoal 1.24:
Variables: FE EE_A EE_B O ES Vars VF RF
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalRecFields {ES}> FE EE_B RF VF O ES *
H1 : is_recFieldExprs RF
Vars : varsRecFields RF Vars
H2 : <evalRecFields {ES}> FE EE_A RF VF O ES
============================
<evalExpr {ES}> FE EE_A (recBuild RF) (recVal VF) O ES
< search.
Subgoal 1.25:
Variables: FE EE_A EE_B V O ES Vars Fields F Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (recFieldAccess Rec F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) O ES *
EvB2 : lookupRecFieldVal Fields F V
============================
<evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V O ES
< case IsE.
Subgoal 1.25:
Variables: FE EE_A EE_B V O ES Vars Fields F Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Vars : vars (recFieldAccess Rec F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) O ES *
EvB2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
<evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V O ES
< Vars: case Vars.
Subgoal 1.25:
Variables: FE EE_A EE_B V O ES Vars Fields F Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) O ES *
EvB2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
============================
<evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V O ES
< apply IH_E to _ _ _ _ EvB1 Vars Rel.
Subgoal 1.25:
Variables: FE EE_A EE_B V O ES Vars Fields F Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : <evalExpr {ES}> FE EE_B Rec (recVal Fields) O ES *
EvB2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
Vars : vars Rec Vars
H3 : <evalExpr {ES}> FE EE_A Rec (recVal Fields) O ES
============================
<evalExpr {ES}> FE EE_A (recFieldAccess Rec F) V 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 V X E Ty
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V 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 V X E Ty
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V 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
< Is: case IsS.
Subgoal 2.3:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< Vars: apply vars_exist to Is2.
Subgoal 2.3:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (declare Ty X E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
============================
forall X V2,
mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
< intros M L.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
============================
lookupScopes X1 (Scope::EE_A) V2
< apply vars_is to _ Vars.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V2
< apply mem_is_string to _ M.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V2
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.3.1:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V2
============================
lookupScopes X1 (Scope::EE_A) V2
< search.
Subgoal 2.3:
Variables: FE EE_A EE_B O N Len Scope ES V X E Ty V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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)::Scope)::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E V O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_typ Ty
Is1 : is_string X
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
============================
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 E X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) 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 E X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) 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
< Is: case IsS.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< Vars: apply vars_exist to Is1.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assign X E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
============================
forall X V2,
mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
< intros M L.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
============================
lookupScopes X1 (Scope::EE_A) V2
< apply vars_is to _ Vars.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
============================
lookupScopes X1 (Scope::EE_A) V2
< apply mem_is_string to _ M.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
============================
lookupScopes X1 (Scope::EE_A) V2
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.4.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1 X1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
M : mem X1 V1
L : lookupScopes X1 (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V2
============================
lookupScopes X1 (Scope::EE_A) V2
< search.
Subgoal 2.4:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V E X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
============================
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 E X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
============================
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 E X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
============================
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 E X V1 RA
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : replaceScopes X V (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string X
Is1 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : replaceScopes X V (Scope::EE_A) RA
H3 : 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 FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) 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 FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) 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
< Is: case IsS.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< Vars: apply vars_exist to Is2.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (recUpdate Rec Fields E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
============================
forall X V2,
mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
< intros M L.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
M : mem X V1
L : lookupScopes X (Scope::EE_B) V2
============================
lookupScopes X (Scope::EE_A) V2
< apply vars_is to _ Vars.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
M : mem X V1
L : lookupScopes X (Scope::EE_B) V2
H1 : is_list is_string V1
============================
lookupScopes X (Scope::EE_A) V2
< apply mem_is_string to _ M.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
M : mem X V1
L : lookupScopes X (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V2
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.5.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
M : mem X V1
L : lookupScopes X (Scope::EE_B) V2
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V2
============================
lookupScopes X (Scope::EE_A) V2
< search.
Subgoal 2.5:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES V FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V 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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
============================
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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
============================
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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : 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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : 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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsRF1 : is_string Rec
H3 : is_recFieldVals 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 FieldVals NewVals E Fields Rec V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsRF1 : is_string Rec
H3 : is_recFieldVals FieldVals
H4 : is_recFieldVals 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 FieldVals NewVals E Fields Rec V1 RA
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES *
EvB2 : lookupScopes Rec (Scope::EE_B) (recVal FieldVals)
EvB3 : updateRecFields Fields V FieldVals NewVals
EvB4 : replaceScopes Rec (recVal NewVals) (Scope::EE_B) EE_B'
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string Rec
Is1 : is_list is_string Fields
Is2 : is_expr E
Vars : vars E V1
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E V O ES
EvB1' : evalExpr FE (Scope::EE_B) E V O
H1 : is_value V
H2 : lookupScopes Rec (Scope::EE_A) (recVal FieldVals)
IsRF1 : is_string Rec
H3 : is_recFieldVals FieldVals
H4 : is_recFieldVals NewVals
H5 : replaceScopes Rec (recVal NewVals) (Scope::EE_A) RA
H6 : 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 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) 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 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) 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
< Is: case IsS.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.6.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
============================
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 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
============================
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 O2 Scope1 O3 El Th Cond V EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::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 ([]::(Scope::EE_A)) N4.
Subgoal 2.6:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Th EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Th EE_A' O3
Len'' : length EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Th EE_A' O3
Len'' : length EE_A' N4
H1 : 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 O2 Scope1 O3 El Th Cond V N1 N4 H T
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Th (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Th (H::T) O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Th (H::T) O3
Len'' : length (H::T) N4
H1 : 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 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) 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 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) 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
< Is: case IsS.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
exists EE_A',
<evalStmt {ES}> FE (Scope::EE_A) (ifThenElse Cond Th El) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.7.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
============================
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 O2 Scope1 O3 El Th Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
============================
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 O2 Scope1 O3 El Th Cond V EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::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 ([]::(Scope::EE_A)) N4.
Subgoal 2.7:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) El EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) El EE_A' O3
Len'' : length EE_A' 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 O2 Scope1 O3 El Th Cond V EE_A' N1 N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El EE_A' O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) El EE_A' O3
Len'' : length EE_A' N4
H1 : 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 O2 Scope1 O3 El Th Cond V N1 N4 H T
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N2 *
EvB3 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) El (Scope1::EE_B') O3 N3 *
EvB4 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Th
Is2 : is_stmt El
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal O2 N2
EvB1' : evalExpr FE (Scope::EE_B) Cond falseVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) El (H::T) O3 N3
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N4
LenA'+ : length ([]::(Scope::EE_A)) N4
EvA2' : evalStmt FE ([]::(Scope::EE_A)) El (H::T) O3
Len'' : length (H::T) N4
H1 : 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 O2 Scope1 EE1 O3 O4 O12 Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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 O2 Scope1 EE1 O3 O4 O12 Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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
< Is: case IsS.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.8.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal 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 O2 Scope1 EE1 O3 O4 O12 Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1 N6
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::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 ([]::(Scope::EE_A)) N6.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1 N6
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1 N6
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body EE_A' O3
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1 N6
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body EE_A' O3
Len'' : length EE_A' 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 O2 Scope1 EE1 O3 O4 O12 Body Cond V EE_A' N1 N6
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body EE_A' O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body EE_A' O3
Len'' : length EE_A' N6
H1 : 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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N1 N6 H T
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::T) O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::T) O3
Len'' : length (H::T) N6
H1 : N6 > 0
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N1 N6 H T
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::T) O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::T) O3
Len'' : length (H::T) N6
H1 : N6 > 0
H2 : N1 > 0
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Len': case Len'' (keep).
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N1 N6 H T N'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::T) O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::T) O3
Len'' : length (H::T) N6
H1 : N6 > 0
H2 : N1 > 0
Len' : length T N'
Len'1 : 1 + N' = N6
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to Len'.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N1 N6 H T N'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::T) O3 N2
LenA : length (Scope::EE_A) N1
IsN1 : is_integer N1
P : 1 + N1 = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::T) O3
Len'' : length (H::T) N6
H1 : N6 > 0
H2 : N1 > 0
Len' : length T N'
Len'1 : 1 + N' = N6
H3 : 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 _ _ _ P Len'1.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H T N'
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::T) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::T) O3
Len'' : length (H::T) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length T N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< IsN7: apply length_is to LenB.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : 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 _ IsN7 with
N1 = 1.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenB'+: assert length ([]::(Scope::EE_B)) N8.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< LenB'': apply evalStmt_keep_scopes to _ _ _ EvB2' LenB'+.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
LenB'' : length (Scope1::EE1) N8
============================
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 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 N'1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
LenB'' : length (Scope1::EE1) N8
LenB' : length EE1 N'1
LenB'1 : 1 + N'1 = N8
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_is to LenB'.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 N'1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
LenB'' : length (Scope1::EE1) N8
LenB' : length EE1 N'1
LenB'1 : 1 + N'1 = N8
H4 : is_integer N'1
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply plus_integer_unique_addend to _ _ _ LenB'1 P'.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
LenB'' : length (Scope1::EE1) N8
LenB' : length EE1 N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply cons_length to LenB.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 EE1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3 N2 *
EvB5 : <evalStmt {ES}> FE EE1 (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::EE1) O3
LenB'' : length (Scope1::EE1) N8
LenB' : length EE1 N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< apply length_cons to LenB' _.
Subgoal 2.8:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 H2 T2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
============================
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 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 H2 T2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
NNS'' : newNameScopes N Len (H::(H1::T1)) (Scope1::(H2::T2))
============================
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 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
NNS'' : newNameScopes N Len (H::(H1::T1)) (Scope1::(H2::T2))
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = 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 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
NNS'' : newNameScopes N Len (H::(H1::T1)) (Scope1::(H2::T2))
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS_: case NNS''.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 N8 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) 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 LenB'' NNS_.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = Len
LenB'+ : length ([]::(Scope::EE_B)) Len
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) Len
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = Len
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) 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
< L: apply lt_plus_one to LenB'1 _.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = Len
LenB'+ : length ([]::(Scope::EE_B)) Len
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) Len
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = Len
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
L : N7 < 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:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = Len
LenB'+ : length ([]::(Scope::EE_B)) Len
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) Len
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = Len
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
L : N7 < Len
H6 : is_integer N'2
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L': apply lt_plus_one to LenB-1 _.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = Len
LenB'+ : length ([]::(Scope::EE_B)) Len
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) Len
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = Len
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
L : N7 < Len
H6 : is_integer N'2
L' : N'2 < N7
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L'': apply less_integer_transitive to L' L.
Subgoal 2.8.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 H N' H1 T1 N7 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (H::(H1::T1)) O3
Len'' : length (H::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = Len
LenB'+ : length ([]::(Scope::EE_B)) Len
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) Len
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = Len
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (Scope1::(H2::T2)) Len
NNS_1 : drop N9 (H::(H1::T1)) (Scope1::(H2::T2))
NNS_2 : take N9 (H::(H1::T1)) N
NNS_3 : names N SNames
NNS_4 : names (Scope1::(H2::T2)) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
L : N7 < Len
H6 : is_integer N'2
L' : N'2 < N7
L'' : N'2 < 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.3:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' H1 T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3
Len'' : length (Scope1::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len (H1::T1) (H2::T2)
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< NNS_: case NNS_.
Subgoal 2.8.3.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' H1 T1 N7 N8 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3
Len'' : length (Scope1::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : length (H2::T2) Len
NNS_1 : drop N9 (H1::T1) (H2::T2)
NNS_2 : take N9 (H1::T1) N
NNS_3 : names N SNames
NNS_4 : names (H2::T2) 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 LenB' NNS_.
Subgoal 2.8.3.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' H1 T1 N8 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3
Len'' : length (Scope1::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) Len
IsN7 : is_integer Len
P' : 1 + Len = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) Len
LenB'1 : 1 + Len = N8
H4 : is_integer Len
H5 : Len > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = Len
LEq : Len <= N'2
NNS_ : length (H2::T2) Len
NNS_1 : drop N9 (H1::T1) (H2::T2)
NNS_2 : take N9 (H1::T1) N
NNS_3 : names N SNames
NNS_4 : names (H2::T2) 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.3.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' H1 T1 N8 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3
Len'' : length (Scope1::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) Len
IsN7 : is_integer Len
P' : 1 + Len = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) Len
LenB'1 : 1 + Len = N8
H4 : is_integer Len
H5 : Len > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = Len
LEq : Len <= N'2
NNS_ : length (H2::T2) Len
NNS_1 : drop N9 (H1::T1) (H2::T2)
NNS_2 : take N9 (H1::T1) N
NNS_3 : names N SNames
NNS_4 : names (H2::T2) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer N'2
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< L: apply lt_plus_one to LenB-1 _.
Subgoal 2.8.3.1:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' H1 T1 N8 H2 T2 N'2 N9 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H1::T1)) O3
Len'' : length (Scope1::(H1::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H1::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) Len
IsN7 : is_integer Len
P' : 1 + Len = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) Len
LenB'1 : 1 + Len = N8
H4 : is_integer Len
H5 : Len > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = Len
LEq : Len <= N'2
NNS_ : length (H2::T2) Len
NNS_1 : drop N9 (H1::T1) (H2::T2)
NNS_2 : take N9 (H1::T1) N
NNS_3 : names N SNames
NNS_4 : names (H2::T2) BNames
NNS_5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer N'2
L : N'2 < 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.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Is+: apply evalStmt_isCtx to _ _ _ EvB2'.
Subgoal 2.8.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
Is+ : is_list (is_list (is_pair is_string is_value)) (Scope1::(H2::T2))
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< case Is+.
Subgoal 2.8.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
H6 : is_list (is_pair is_string is_value) Scope1
H7 : is_list (is_list (is_pair is_string is_value)) (H2::T2)
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Is+: apply evalStmt_isCtx to _ _ _ EvA2'.
Subgoal 2.8.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
H6 : is_list (is_pair is_string is_value) Scope1
H7 : is_list (is_list (is_pair is_string is_value)) (H2::T2)
Is+ : is_list (is_list (is_pair is_string is_value)) (Scope1::(H2::T1))
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< case Is+.
Subgoal 2.8.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
H6 : is_list (is_pair is_string is_value) Scope1
H7 : is_list (is_list (is_pair is_string is_value)) (H2::T2)
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) (H2::T1)
============================
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.3.2:
Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N5 O2 Scope1 O3 O4 O12 Body Cond V N6 N' T1 N7 N8 H2 T2 N'2 EE_A'1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O2 N3 *
EvB4 : <evalStmt {ES}> FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3 N2 *
EvB5 : <evalStmt {ES}> FE (H2::T2) (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)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond trueVal O2 N3
EvB1' : evalExpr FE (Scope::EE_B) Cond trueVal O2
EvA2 : <evalStmt {ES}> FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3 N2
LenA : length (Scope::EE_A) N'
IsN1 : is_integer N'
P : 1 + N' = N6
LenA'+ : length ([]::(Scope::EE_A)) N6
EvA2' : evalStmt FE ([]::(Scope::EE_A)) Body (Scope1::(H2::T1)) O3
Len'' : length (Scope1::(H2::T1)) N6
H1 : N6 > 0
H2 : N' > 0
Len' : length (H2::T1) N'
Len'1 : 1 + N' = N6
H3 : is_integer N'
LenB : length (Scope::EE_B) N7
IsN7 : is_integer N7
P' : 1 + N7 = N8
LenB'+ : length ([]::(Scope::EE_B)) N8
EvB2' : evalStmt FE ([]::(Scope::EE_B)) Body (Scope1::(H2::T2)) O3
LenB'' : length (Scope1::(H2::T2)) N8
LenB' : length (H2::T2) N7
LenB'1 : 1 + N7 = N8
H4 : is_integer N7
H5 : N7 > 0
LenB- : length EE_B N'2
LenB-1 : 1 + N'2 = N7
LEq : Len <= N'2
NNS_ : newNameScopes N Len T1 T2
H6 : is_list (is_pair is_string is_value) Scope1
H7 : is_list (is_list (is_pair is_string is_value)) (H2::T2)
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) (H2::T1)
H10 : <evalStmt {ES}> FE (H2::T1) (while Cond Body) EE_A'1 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 O N Len Scope ES Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal 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 O N Len Scope ES Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal 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
< Is: case IsS.
Subgoal 2.9:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.9:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (while Cond Body) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.9.1:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.9.1:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.9.1:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.9.1:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.9.1:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.9:
Variables: FE EE_A EE_B O N Len Scope ES Body Cond V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) Cond falseVal O ES *
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr Cond
Is1 : is_stmt Body
Vars : vars Cond V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) Cond falseVal 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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 O N Len Scope ES I O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) 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 O N Len Scope ES I O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) 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
< Is: case IsS.
Subgoal 2.11:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.11:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.11.1:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.11:
Variables: FE EE_A EE_B O N Len Scope ES I O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (intVal I) O2 ES *
EvB2 : O2 ++ [intVal I] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E (intVal I) 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 O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal 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 O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal 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
< Is: case IsS.
Subgoal 2.12:
Variables: FE EE_A EE_B O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.12:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.12.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.12:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal O2 ES *
EvB2 : O2 ++ [trueVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E trueVal 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 O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal 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 O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal 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
< Is: case IsS.
Subgoal 2.13:
Variables: FE EE_A EE_B O N Len Scope ES O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.13:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.13.1:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.13:
Variables: FE EE_A EE_B O N Len Scope ES O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E falseVal O2 ES *
EvB2 : O2 ++ [falseVal] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E falseVal 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 O N Len Scope ES S1 O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) 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 O N Len Scope ES S1 O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) 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
< Is: case IsS.
Subgoal 2.14:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< Vars: apply vars_exist to Is.
Subgoal 2.14:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (printVal E) EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB1 Vars _ with
EE_A = Scope::EE_A.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
============================
forall X V1,
mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros M L.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
============================
lookupScopes X (Scope::EE_A) V1
< apply vars_is to _ Vars.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
============================
lookupScopes X (Scope::EE_A) V1
< apply mem_is_string to _ M.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
============================
lookupScopes X (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ NNS' L.
Subgoal 2.14.1:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
M : mem X V
L : lookupScopes X (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V1
============================
lookupScopes X (Scope::EE_A) V1
< search.
Subgoal 2.14:
Variables: FE EE_A EE_B O N Len Scope ES S1 O2 E V
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_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) (Scope::EE_B) O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : <evalExpr {ES}> FE (Scope::EE_B) E (stringVal S1) O2 ES *
EvB2 : O2 ++ [stringVal S1] = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_expr E
Vars : vars E V
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) E (stringVal S1) 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 Vars
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 [] [] 0 @
Vars : varsArgs nilArgs Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalArgs {ES}> FE EE_A nilArgs [] [] 0
< search.
Subgoal 3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) O ES @
Vars : varsArgs (consArgs E Rest) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) O ES
< case IsA.
Subgoal 3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Vars : varsArgs (consArgs E Rest) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
============================
<evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) O ES
< Vars: case Vars.
Subgoal 3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
<evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) O ES
< apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 3.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
forall X V1, mem X VE -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 3.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_left to M Vars2.
Subgoal 3.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 3.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
H3 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
============================
<evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) O ES
< apply IH_A to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 3.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
============================
forall X V1, mem X VRest1 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 3.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_right to M Vars2.
Subgoal 3.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 3.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
H4 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 3.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
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) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalArgs {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
Vars : vars E VE
Vars1 : varsArgs Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H3 : <evalExpr {ES}> FE EE_A E V1 O2 N2
H4 : <evalArgs {ES}> FE EE_A Rest VRest O3 N1
============================
<evalArgs {ES}> FE EE_A (consArgs E Rest) (V1::VRest) O ES
< search.
Subgoal 4.1:
Variables: FE EE_A EE_B Vars
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 nilRecFieldVals [] 0 @
Vars : varsRecFields nilRecFieldExprs Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
<evalRecFields {ES}> FE EE_A nilRecFieldExprs nilRecFieldVals [] 0
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consRecFieldVals F V1 VRest) O ES @
Vars : varsRecFields (consRecFieldExprs F E Rest) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
============================
<evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O ES
< case IsRF.
Subgoal 4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Vars : varsRecFields (consRecFieldExprs F E Rest) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
============================
<evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O ES
< Vars: case Vars.
Subgoal 4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
<evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O ES
< apply IH_E to _ _ _ _ EvB2 Vars _ with
EE_A = EE_A.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
============================
forall X V1, mem X VE -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_left to M Vars2.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 4.2.1:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
M : mem X VE
L : lookupScopes X EE_B V2
M' : mem X Vars
H4 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
============================
<evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O ES
< apply IH_RF to _ _ _ _ EvB3 Vars1 _ with
EE_A = EE_A.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
============================
forall X V1, mem X VRest1 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
============================
lookupScopes X EE_A V2
< M': apply mem_append_right to M Vars2.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
============================
lookupScopes X EE_A V2
< apply Rel to M' L.
Subgoal 4.2.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1 X V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
M : mem X VRest1
L : lookupScopes X EE_B V2
M' : mem X Vars
H5 : lookupScopes X EE_A V2
============================
lookupScopes X EE_A V2
< search.
Subgoal 4.2:
Variables: FE EE_A EE_B O ES Vars N2 N1 O2 O3 VRest V1 F Rest E VE VRest1
IH_E : forall FE EE_A EE_B E V O ES Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalExpr {ES}> FE EE_B E V O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
<evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V O ES Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalArgs {ES}> FE EE_B A V O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
<evalRecFields {ES}> FE EE_B RF V O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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) (consRecFieldVals F V1 VRest) O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : N2 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E V1 O2 N2 *
EvB3 : <evalRecFields {ES}> FE EE_B Rest VRest O3 N1 *
EvB4 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
Vars : vars E VE
Vars1 : varsRecFields Rest VRest1
Vars2 : VE ++ VRest1 = Vars
H4 : <evalExpr {ES}> FE EE_A E V1 O2 N2
H5 : <evalRecFields {ES}> FE EE_A Rest VRest O3 N1
============================
<evalRecFields {ES}> FE EE_A (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O ES
< search.
Proof completed.
< Theorem evalExpr_rel_exists :
forall FE EE_A EE_B E V O Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> vars E Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalExpr FE EE_A E V O.
============================
forall FE EE_A EE_B E V O Vars,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> vars E Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalExpr FE EE_A E V O
< intros IsE IsFE IsA IsB Ev Vars Rel.
Variables: FE EE_A EE_B E V O Vars
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 O
Vars : vars E Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
evalExpr FE EE_A E V O
< Ev': apply add_ext_size_evalExpr to Ev.
Variables: FE EE_A EE_B E V O Vars 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
IsA : is_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 O
Vars : vars E Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalExpr {ES}> FE EE_B E V O N
============================
evalExpr FE EE_A E V O
< E: apply evalExpr_rel_exists_ES to IsE IsFE IsA IsB Ev' Vars Rel.
Variables: FE EE_A EE_B E V O Vars 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
IsA : is_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 O
Vars : vars E Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalExpr {ES}> FE EE_B E V O N
E : <evalExpr {ES}> FE EE_A E V O N
============================
evalExpr FE EE_A E V O
< apply drop_ext_size_evalExpr to E.
Variables: FE EE_A EE_B E V O Vars 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
IsA : is_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 O
Vars : vars E Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalExpr {ES}> FE EE_B E V O N
E : <evalExpr {ES}> FE EE_A E V O N
H1 : evalExpr FE EE_A E V O
============================
evalExpr FE EE_A E V 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_rel_exists :
forall FE EE_A EE_B A V O Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> varsArgs A Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalArgs FE EE_A A V O.
============================
forall FE EE_A EE_B A V O Vars,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> varsArgs A Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalArgs FE EE_A A V O
< intros IsAr IsFE IsA IsB Ev Vars Rel.
Variables: FE EE_A EE_B A V O Vars
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 O
Vars : varsArgs A Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
evalArgs FE EE_A A V O
< Ev': apply add_ext_size_evalArgs to Ev.
Variables: FE EE_A EE_B A V O Vars N
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 O
Vars : varsArgs A Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalArgs {ES}> FE EE_B A V O N
============================
evalArgs FE EE_A A V O
< E: apply evalArgs_rel_exists_ES to IsAr IsFE IsA IsB Ev' Vars Rel.
Variables: FE EE_A EE_B A V O Vars N
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 O
Vars : varsArgs A Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalArgs {ES}> FE EE_B A V O N
E : <evalArgs {ES}> FE EE_A A V O N
============================
evalArgs FE EE_A A V O
< apply drop_ext_size_evalArgs to E.
Variables: FE EE_A EE_B A V O Vars N
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 O
Vars : varsArgs A Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalArgs {ES}> FE EE_B A V O N
E : <evalArgs {ES}> FE EE_A A V O N
H1 : evalArgs FE EE_A A V O
============================
evalArgs FE EE_A A V O
< search.
Proof completed.
< Theorem evalRecFields_rel_exists :
forall FE EE_A EE_B RF V O Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalRecFields FE EE_A RF V O.
============================
forall FE EE_A EE_B RF V O Vars,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_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 O -> varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> evalRecFields FE EE_A RF V O
< intros IsRF IsFE IsA IsB Ev Vars Rel.
Variables: FE EE_A EE_B RF V O Vars
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 O
Vars : varsRecFields RF Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
evalRecFields FE EE_A RF V O
< Ev': apply add_ext_size_evalRecFields to Ev.
Variables: FE EE_A EE_B RF V O Vars 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
IsA : is_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 O
Vars : varsRecFields RF Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalRecFields {ES}> FE EE_B RF V O N
============================
evalRecFields FE EE_A RF V O
< E: apply evalRecFields_rel_exists_ES to IsRF IsFE IsA IsB Ev' Vars Rel.
Variables: FE EE_A EE_B RF V O Vars 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
IsA : is_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 O
Vars : varsRecFields RF Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalRecFields {ES}> FE EE_B RF V O N
E : <evalRecFields {ES}> FE EE_A RF V O N
============================
evalRecFields FE EE_A RF V O
< apply drop_ext_size_evalRecFields to E.
Variables: FE EE_A EE_B RF V O Vars 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
IsA : is_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 O
Vars : varsRecFields RF Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
Ev' : <evalRecFields {ES}> FE EE_B RF V O N
E : <evalRecFields {ES}> FE EE_A RF V O N
H1 : evalRecFields FE EE_A RF V O
============================
evalRecFields FE EE_A RF V 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 OA EE_B VB 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 OA ->
EvB : evalExpr FE EE_B E VB OB ->
VA = VB /\
OA = OB
on EvA as IH_E,
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 OA EE_B VB 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 OA ->
EvB : evalArgs FE EE_B A VB OB ->
VA = VB /\
OA = OB
on EvA as IH_A,
evalRecFields_scopes_same : forall RF FE EE_A VA OA EE_B VB 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 OA ->
EvB : evalRecFields FE EE_B RF VB OB ->
VA = VB /\
OA = OB
on EvA as IH_RF.
Subgoal 1.1:
Variables: FE EE_A EE_B VB OB I
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) [] @
EvB : evalExpr FE EE_B (num I) VB 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) [] @
============================
intVal I = intVal I /\ [] = []
< search.
Subgoal 1.2:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (plus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 + I2 = I
EvA4 : O1 ++ O2 = OA
============================
intVal I = VB /\ OA = OB
< case IsE.
Subgoal 1.2:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (plus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.2:
Variables: FE EE_A OA EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.2:
Variables: FE EE_A EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OB = OB
< apply plus_integer_unique to EvA3 EvB2.
Subgoal 1.2:
Variables: FE EE_A EE_B OB E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 + I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I3 = intVal I3 /\ OB = OB
< search.
Subgoal 1.3:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (minus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 - I2 = I
EvA4 : O1 ++ O2 = OA
============================
intVal I = VB /\ OA = OB
< case IsE.
Subgoal 1.3:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (minus E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.3:
Variables: FE EE_A OA EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.3:
Variables: FE EE_A EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OB = OB
< apply minus_integer_unique to EvA3 EvB2.
Subgoal 1.3:
Variables: FE EE_A EE_B OB E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 - I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I3 = intVal I3 /\ OB = OB
< search.
Subgoal 1.4:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (mult E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 * I2 = I
EvA4 : O1 ++ O2 = OA
============================
intVal I = VB /\ OA = OB
< case IsE.
Subgoal 1.4:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (mult E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.4:
Variables: FE EE_A OA EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.4:
Variables: FE EE_A EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OB = OB
< apply multiply_integer_unique to EvA3 EvB2.
Subgoal 1.4:
Variables: FE EE_A EE_B OB E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 * I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I3 = intVal I3 /\ OB = OB
< search.
Subgoal 1.5:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (div E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 / I2 = I
EvA4 : O1 ++ O2 = OA
============================
intVal I = VB /\ OA = OB
< case IsE.
Subgoal 1.5:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 I E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (div E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) 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 OA EE_B OB I2 O2 I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.5:
Variables: FE EE_A OA EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.5:
Variables: FE EE_A EE_B OB I E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I = intVal I3 /\ OB = OB
< apply divide_integer_unique to EvA3 EvB2.
Subgoal 1.5:
Variables: FE EE_A EE_B OB E2 E1 I4 O3 I5 O4 I3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (intVal I4) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I5) 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) O3
EvB1 : evalExpr FE EE_B E2 (intVal I5) O4
EvB2 : I4 / I5 = I3
EvB3 : O3 ++ O4 = OB
============================
intVal I3 = intVal I3 /\ OB = OB
< search.
Subgoal 1.6:
Variables: FE EE_A EE_B VB OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] @
EvB : evalExpr FE EE_B true VB OB
============================
trueVal = VB /\ [] = OB
< case EvB.
Subgoal 1.6:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] @
============================
trueVal = trueVal /\ [] = []
< search.
Subgoal 1.7:
Variables: FE EE_A EE_B VB OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] @
EvB : evalExpr FE EE_B false VB OB
============================
falseVal = VB /\ [] = OB
< case EvB.
Subgoal 1.7:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] @
============================
falseVal = falseVal /\ [] = []
< search.
Subgoal 1.8:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.8:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.8.1:
Variables: FE EE_A OA EE_B OB O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.8.1:
Variables: FE EE_A OA EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.8.1:
Variables: FE EE_A EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.8.2:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.8.3:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA2 EvB1.
Subgoal 1.9:
Variables: FE EE_A OA EE_B VB OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.9:
Variables: FE EE_A OA EE_B VB OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
============================
falseVal = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.9.1:
Variables: FE EE_A OA EE_B OB E2 E1 O1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.9.2:
Variables: FE EE_A OA EE_B OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.9.2:
Variables: FE EE_A EE_B OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.9.3:
Variables: FE EE_A OA EE_B OB E2 E1 O1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.10:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.10:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (and E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.10.2:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.10.3:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.10.3:
Variables: FE EE_A OA EE_B OB O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.10.3:
Variables: FE EE_A OA EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.10.3:
Variables: FE EE_A EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.11:
Variables: FE EE_A OA EE_B VB OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.11:
Variables: FE EE_A OA EE_B VB OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
============================
trueVal = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.11.1:
Variables: FE EE_A OA EE_B OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.11.1:
Variables: FE EE_A EE_B OB E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.11.2:
Variables: FE EE_A OA EE_B OB E2 E1 O1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 trueVal O2
EvB2 : O1 ++ O2 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.11.3:
Variables: FE EE_A OA EE_B OB E2 E1 O1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O1
EvB1 : evalExpr FE EE_B E2 falseVal O2
EvB2 : O1 ++ O2 = OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.12:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.12:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal 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 OA EE_B OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.12.2:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.12.2:
Variables: FE EE_A OA EE_B OB O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.12.2:
Variables: FE EE_A OA EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.12.2:
Variables: FE EE_A EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 trueVal O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.12.3:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 trueVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.13:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.13:
Variables: FE EE_A OA EE_B VB OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (or E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal 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 OA EE_B OB O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 trueVal OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.13.2:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 trueVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.13.3:
Variables: FE EE_A OA EE_B OB O1 O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O1 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.13.3:
Variables: FE EE_A OA EE_B OB O2 E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.13.3:
Variables: FE EE_A OA EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.13.3:
Variables: FE EE_A EE_B OB E2 E1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal O3 *
EvA2 : evalExpr FE EE_A E2 falseVal O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 falseVal O3
EvB1 : evalExpr FE EE_B E2 falseVal O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.14:
Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.14:
Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
============================
trueVal = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.14.1:
Variables: FE EE_A OA EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 falseVal OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.14.1:
Variables: FE EE_A EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 falseVal OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 falseVal OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.14.2:
Variables: FE EE_A OA EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 falseVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 trueVal OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.15:
Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.15:
Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (not E1) VB OB
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
============================
falseVal = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.15.1:
Variables: FE EE_A OA EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 falseVal OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.15.2:
Variables: FE EE_A OA EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 trueVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 trueVal OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.15.2:
Variables: FE EE_A EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 trueVal OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 trueVal OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.16:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = OA
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.16:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.16.1:
Variables: FE EE_A OA EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.16.1:
Variables: FE EE_A EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.16.2:
Variables: FE EE_A OA EE_B OB I1 O1 I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 > I2
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 > I2
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.16.2:
Variables: FE EE_A OA EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 > I4
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply greater_lesseq_integer_false to EvA3 EvB2.
Subgoal 1.17:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = OA
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.17:
Variables: FE EE_A OA EE_B VB OB I1 O1 I2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (greater E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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 OA EE_B OB I1 O1 I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.17.1:
Variables: FE EE_A OA EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 > I4
EvB3 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply greater_lesseq_integer_false to EvB2 EvA3.
Subgoal 1.17.2:
Variables: FE EE_A OA EE_B OB I1 O1 I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O1 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I1 <= I2
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) 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 OA EE_B OB I2 O2 E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O2 *
EvA3 : I3 <= I2
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.17.2:
Variables: FE EE_A OA EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.17.2:
Variables: FE EE_A EE_B OB E2 E1 I3 O3 I4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 (intVal I3) O3 *
EvA2 : evalExpr FE EE_A E2 (intVal I4) O4 *
EvA3 : I3 <= I4
EvA4 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 (intVal I3) O3
EvB1 : evalExpr FE EE_B E2 (intVal I4) O4
EvB2 : I3 <= I4
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.18:
Variables: FE EE_A OA EE_B VB OB V O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = OA
============================
trueVal = VB /\ OA = OB
< case IsE.
Subgoal 1.18:
Variables: FE EE_A OA EE_B VB OB V O1 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V 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 OA EE_B OB V O1 O2 E2 E1 V1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.18.1:
Variables: FE EE_A OA EE_B OB O2 E2 E1 V1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.18.1:
Variables: FE EE_A OA EE_B OB E2 E1 V1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.18.1:
Variables: FE EE_A EE_B OB E2 E1 V1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V1 O4
EvB2 : O3 ++ O4 = OB
============================
trueVal = trueVal /\ OB = OB
< search.
Subgoal 1.18.2:
Variables: FE EE_A OA EE_B OB V O1 O2 E2 E1 V1 O3 V2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O1 *
EvA2 : evalExpr FE EE_A E2 V O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V2 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 OA EE_B OB O2 E2 E1 V1 O3 V2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O3 *
EvA2 : evalExpr FE EE_A E2 V1 O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V1 O3
EvB1 : evalExpr FE EE_B E2 V2 O4
EvB2 : V1 = V2 -> false
EvB3 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.18.2:
Variables: FE EE_A OA EE_B OB E2 E1 O3 V2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V2 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V2 O3
EvB1 : evalExpr FE EE_B E2 V2 O4
EvB2 : V2 = V2 -> false
EvB3 : O3 ++ O4 = OB
============================
trueVal = falseVal /\ OA = OB
< apply EvB2 to _.
Subgoal 1.19:
Variables: FE EE_A OA EE_B VB OB V1 O1 V2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = OA
============================
falseVal = VB /\ OA = OB
< case IsE.
Subgoal 1.19:
Variables: FE EE_A OA EE_B VB OB V1 O1 V2 O2 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (eq E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 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 OA EE_B OB V1 O1 V2 O2 E2 E1 V O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.19.1:
Variables: FE EE_A OA EE_B OB V2 O2 E2 E1 V O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V = V2 -> false
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.19.1:
Variables: FE EE_A OA EE_B OB E2 E1 V O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V O3 *
EvA2 : evalExpr FE EE_A E2 V O4 *
EvA3 : V = V -> false
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V O3
EvB1 : evalExpr FE EE_B E2 V O4
EvB2 : O3 ++ O4 = OB
============================
falseVal = trueVal /\ OA = OB
< apply EvA3 to _.
Subgoal 1.19.2:
Variables: FE EE_A OA EE_B OB V1 O1 V2 O2 E2 E1 V3 O3 V4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V1 = V2 -> false
EvA4 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 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 OA EE_B OB V2 O2 E2 E1 V3 O3 V4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : V3 = V2 -> false
EvA4 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.19.2:
Variables: FE EE_A OA EE_B OB E2 E1 V3 O3 V4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V4 O4 *
EvA3 : V3 = V4 -> false
EvA4 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.19.2:
Variables: FE EE_A EE_B OB E2 E1 V3 O3 V4 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V4 O4 *
EvA3 : V3 = V4 -> false
EvA4 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : V3 = V4 -> false
EvB3 : O3 ++ O4 = OB
============================
falseVal = falseVal /\ OB = OB
< search.
Subgoal 1.20:
Variables: FE EE_A EE_B VB OB S
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) [] @
EvB : evalExpr FE EE_B (stringLit S) VB 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) [] @
============================
stringVal S = stringVal S /\ [] = []
< search.
Subgoal 1.21:
Variables: FE EE_A OA EE_B VB OB S1 O1 S2 O2 S E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (appString E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O2 *
EvA3 : S1 ++ S2 = S
EvA4 : O1 ++ O2 = OA
============================
stringVal S = VB /\ OA = OB
< case IsE.
Subgoal 1.21:
Variables: FE EE_A OA EE_B VB OB S1 O1 S2 O2 S E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (appString E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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 OA EE_B OB S1 O1 S2 O2 S E2 E1 S4 O3 S5 O4 S3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O1 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) 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 OA EE_B OB S2 O2 S E2 E1 S4 O3 S5 O4 S3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
stringVal S = stringVal S3 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1.
Subgoal 1.21:
Variables: FE EE_A OA EE_B OB S E2 E1 S4 O3 S5 O4 S3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
stringVal S = stringVal S3 /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.21:
Variables: FE EE_A OA EE_B OB E2 E1 S4 O3 S5 O4 S3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
stringVal S3 = stringVal S3 /\ OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 1.21:
Variables: FE EE_A EE_B OB E2 E1 S4 O3 S5 O4 S3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalExpr FE EE_A E1 (stringVal S4) O3 *
EvA2 : evalExpr FE EE_A E2 (stringVal S5) 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) O3
EvB1 : evalExpr FE EE_B E2 (stringVal S5) O4
EvB2 : S4 ++ S5 = S3
EvB3 : O3 ++ O4 = OB
============================
stringVal S3 = stringVal S3 /\ OB = OB
< search.
Subgoal 1.22:
Variables: FE EE_A VA EE_B VB OB X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] @
EvB : evalExpr FE EE_B (name X) VB OB
EvA1 : lookupScopes X EE_A VA
============================
VA = VB /\ [] = OB
< case IsE.
Subgoal 1.22:
Variables: FE EE_A VA EE_B VB OB X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 [] @
EvB : evalExpr FE EE_B (name X) VB OB
EvA1 : lookupScopes X EE_A VA
H1 : is_string X
============================
VA = VB /\ [] = OB
< EvB: case EvB.
Subgoal 1.22:
Variables: FE EE_A VA EE_B VB X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 [] @
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 EE_B VB X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 [] @
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 OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (call Fun Args) VB OB
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
============================
VA = VB /\ OA = OB
< case IsE.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (call Fun Args) VB OB
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
============================
VA = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun RetVar1 RVVal1 ArgNames1 Body1 ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = OA
EvA6 : lookupScopes RetVar EE1 VA
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar1, (RVVal1, (ArgNames1, Body1)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames1 ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar1, RVVal1)::InitEnv1] Body1 EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar1 EE2 VB
============================
VA = VB /\ OA = OB
< apply lookup_unique to EvB EvA1.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body ArgVals O1 InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O1 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O1 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 VB
============================
VA = VB /\ OA = OB
< apply IH_A to _ _ _ _ SS EvA2 EvB1.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body InitEnv EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 VB
============================
VA = VB /\ OA = OB
< apply zip_unique to EvA3 EvB2.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 VB
============================
VA = VB /\ OA = OB
< IsFP: apply lookup_is_value_funCtx to _ EvA1.
Subgoal 1.23:
Variables: FE EE_A VA OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body EE1 O2 Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE1 O2 *
EvA5 : O3 ++ O2 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4 *
EvA5 : O3 ++ O4 = 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 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4 *
EvA5 : O3 ++ O4 = OA
EvA6 : lookupScopes RetVar EE2 VB
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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_B VB OB RetVar RVVal ArgNames Body Args Fun ArgVals1 O3 InitEnv1 EE2 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals1 O3 *
EvA3 : zip ArgNames ArgVals1 InitEnv1
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4 *
EvA5 : O3 ++ O4 = OB
EvA6 : lookupScopes RetVar EE2 VB
H1 : is_string Fun
H2 : is_args Args
EvB : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvB1 : evalArgs FE EE_B Args ArgVals1 O3
EvB2 : zip ArgNames ArgVals1 InitEnv1
EvB3 : evalStmt FE [(RetVar, RVVal)::InitEnv1] Body EE2 O4
EvB4 : O3 ++ O4 = OB
EvB5 : lookupScopes RetVar EE2 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 OA EE_B VB OB VF RF
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalExpr FE EE_B (recBuild RF) VB OB
EvA1 : evalRecFields FE EE_A RF VF OA *
============================
recVal VF = VB /\ OA = OB
< case IsE.
Subgoal 1.24:
Variables: FE EE_A OA EE_B VB OB VF RF
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvB : evalExpr FE EE_B (recBuild RF) VB OB
EvA1 : evalRecFields FE EE_A RF VF OA *
H1 : is_recFieldExprs RF
============================
recVal VF = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.24:
Variables: FE EE_A OA EE_B OB VF RF VF1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OA @
EvA1 : evalRecFields FE EE_A RF VF OA *
H1 : is_recFieldExprs RF
EvB : evalRecFields FE EE_B RF VF1 OB
============================
recVal VF = recVal VF1 /\ OA = OB
< apply IH_RF to _ _ _ _ SS EvA1 EvB.
Subgoal 1.24:
Variables: FE EE_A EE_B OB RF VF1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) OB @
EvA1 : evalRecFields FE EE_A RF VF1 OB *
H1 : is_recFieldExprs RF
EvB : evalRecFields FE EE_B RF VF1 OB
============================
recVal VF1 = recVal VF1 /\ OB = OB
< search.
Subgoal 1.25:
Variables: FE EE_A VA OA EE_B VB OB Fields F Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB OB
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal Fields F VA
============================
VA = VB /\ OA = OB
< case IsE.
Subgoal 1.25:
Variables: FE EE_A VA OA EE_B VB OB Fields F Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvB : evalExpr FE EE_B (recFieldAccess Rec F) VB OB
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
============================
VA = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.25:
Variables: FE EE_A VA OA EE_B VB OB Fields F Rec Fields1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) OA *
EvA2 : lookupRecFieldVal Fields F VA
H1 : is_expr Rec
H2 : is_string F
EvB : evalExpr FE EE_B Rec (recVal Fields1) OB
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.25:
Variables: FE EE_A VA EE_B VB OB F Rec Fields1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A Rec (recVal Fields1) OB *
EvA2 : lookupRecFieldVal Fields1 F VA
H1 : is_expr Rec
H2 : is_string F
EvB : evalExpr FE EE_B Rec (recVal Fields1) OB
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VA = VB /\ OB = OB
< apply lookupRecFieldVal_unique to EvA2 EvB1.
Subgoal 1.25:
Variables: FE EE_A EE_B VB OB F Rec Fields1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB @
EvA1 : evalExpr FE EE_A Rec (recVal Fields1) OB *
EvA2 : lookupRecFieldVal Fields1 F VB
H1 : is_expr Rec
H2 : is_string F
EvB : evalExpr FE EE_B Rec (recVal Fields1) OB
EvB1 : lookupRecFieldVal Fields1 F VB
============================
VB = VB /\ OB = OB
< search.
Subgoal 2.1:
Variables: FE EE_A' EE_B EE_B' OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 2.1:
Variables: FE EE_A' EE_B'
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.3:
Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
============================
OA = OB
< case IsS.
Subgoal 2.3:
Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.3:
Variables: FE OA OB EE Scope V X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.3:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
OB = OB
< search.
Subgoal 2.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
============================
OA = OB
< case IsS.
Subgoal 2.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : replaceScopes X V1 EE_B EE_B'
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.4:
Variables: FE EE_A EE_A' EE_B EE_B' OB E X V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : replaceScopes X V1 EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : replaceScopes X V1 EE_B EE_B'
============================
OB = OB
< search.
Subgoal 2.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
============================
OA = OB
< case IsS.
Subgoal 2.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V1 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
============================
OB = OB
< search.
Subgoal 2.6:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Th (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
OA = OB
< case IsS.
Subgoal 2.6:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 2.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1.
Subgoal 2.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 2.6.1:
Variables: FE EE_A EE_A' EE_B EE_B' OB Scope El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OB = OB
< search.
Subgoal 2.6.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.7:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) El (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
OA = OB
< case IsS.
Subgoal 2.7:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 2.7.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1.
Subgoal 2.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 2.7.2:
Variables: FE EE_A EE_A' EE_B EE_B' OB Scope El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O3 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
OB = OB
< search.
Subgoal 2.8:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = OA
============================
OA = OB
< case IsS.
Subgoal 2.8:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
============================
OA = OB
< SS': apply scopes_same_add_scope to SS.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
============================
OA = OB
< apply IH_S to _ _ _ _ _ EvA2 EvB1.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
============================
OA = OB
< SS1: apply IH_S_C to _ _ _ _ _ EvA2 EvB1.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1 : scopes_same (Scope::EE1) (Scope1::EE2)
============================
OA = OB
< SS1': case SS1.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
============================
OA = OB
< IsEE1+: apply evalStmt_isCtx to _ _ _ EvA2.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
OA = OB
< case IsEE1+.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
OA = OB
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvB1.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
OA = OB
< case IsEE2+.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
OA = OB
< apply IH_S to _ _ _ _ _ EvA3 EvB2.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
OA = OB
< apply append_unique to EvA4 EvB3.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
OA = OB
< apply append_unique to EvA5 EvB4.
Subgoal 2.8.1:
Variables: FE EE_A EE_A' EE_B EE_B' OB Scope EE1 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O4 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O5 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
SS' : scopes_same ([]::EE_A) ([]::EE_B)
SS1' : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1'1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS1'2 : scopes_same EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
OB = OB
< search.
Subgoal 2.8.2:
Variables: FE EE_A EE_A' OA EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.9:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
============================
OA = OB
< case IsS.
Subgoal 2.9:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
============================
OA = OB
< EvB: case EvB.
Subgoal 2.9.1:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond O1 Scope EE1 O2 O3 O12
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
EvB : evalExpr FE EE_B Cond trueVal O1
EvB1 : evalStmt FE ([]::EE_B) Body (Scope::EE1) O2
EvB2 : evalStmt FE EE1 (while Cond Body) EE_B' O3
EvB3 : O1 ++ O2 = O12
EvB4 : O12 ++ O3 = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.9.2:
Variables: FE EE_A' OA EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
EvB : evalExpr FE EE_B' Cond falseVal OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.9.2:
Variables: FE EE_A' EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OB *
H1 : is_expr Cond
H2 : is_stmt Body
EvB : evalExpr FE EE_B' Cond falseVal OB
============================
OB = OB
< search.
Subgoal 2.10:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 2.10:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.10:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.10:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1 Scope1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.10:
Variables: FE EE_A EE_A' EE_B EE_B' OB Scope S1 Scope1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 2.11:
Variables: FE EE_A' OA EE_B EE_B' OB I O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) O1 *
EvA2 : O1 ++ [intVal I] = OA
============================
OA = OB
< case IsS.
Subgoal 2.11:
Variables: FE EE_A' OA EE_B EE_B' OB I O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.11.1:
Variables: FE EE_A' OA EE_B' OB I O1 E I1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.11.1:
Variables: FE EE_A' OA EE_B' OB E I1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [intVal I1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
OA = OB
< apply append_unique to EvA2 EvB1.
Subgoal 2.11.1:
Variables: FE EE_A' EE_B' OB E I1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [intVal I1] = OB
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
OB = OB
< search.
Subgoal 2.11.2:
Variables: FE EE_A' OA EE_B' OB I O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.11.3:
Variables: FE EE_A' OA EE_B' OB I O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.11.4:
Variables: FE EE_A' OA EE_B' OB I O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.12:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : O1 ++ [trueVal] = OA
============================
OA = OB
< case IsS.
Subgoal 2.12:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.12.1:
Variables: FE EE_A' OA EE_B' OB O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.12.2:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.12.2:
Variables: FE EE_A' OA EE_B' OB E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OA = OB
< apply append_unique to EvA2 EvB1.
Subgoal 2.12.2:
Variables: FE EE_A' EE_B' OB E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [trueVal] = OB
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OB = OB
< search.
Subgoal 2.12.3:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.12.4:
Variables: FE EE_A' OA EE_B' OB O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.13:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : O1 ++ [falseVal] = OA
============================
OA = OB
< case IsS.
Subgoal 2.13:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.13.1:
Variables: FE EE_A' OA EE_B' OB O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.13.2:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.13.3:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.13.3:
Variables: FE EE_A' OA EE_B' OB E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OA = OB
< apply append_unique to EvA2 EvB1.
Subgoal 2.13.3:
Variables: FE EE_A' EE_B' OB E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [falseVal] = OB
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OB = OB
< search.
Subgoal 2.13.4:
Variables: FE EE_A' OA EE_B' OB O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.14:
Variables: FE EE_A' OA EE_B EE_B' OB S1 O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
============================
OA = OB
< case IsS.
Subgoal 2.14:
Variables: FE EE_A' OA EE_B EE_B' OB S1 O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
============================
OA = OB
< EvB: case EvB.
Subgoal 2.14.1:
Variables: FE EE_A' OA EE_B' OB S1 O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.14.2:
Variables: FE EE_A' OA EE_B' OB S1 O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.14.3:
Variables: FE EE_A' OA EE_B' OB S1 O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.14.4:
Variables: FE EE_A' OA EE_B' OB S1 O1 E S2 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = OB
============================
OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 2.14.4:
Variables: FE EE_A' OA EE_B' OB E S2 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [stringVal S2] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = OB
============================
OA = OB
< apply append_unique to EvA2 EvB1.
Subgoal 2.14.4:
Variables: FE EE_A' EE_B' OB E S2 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [stringVal S2] = OB
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = OB
============================
OB = OB
< search.
Subgoal 3.1:
Variables: FE EE_A' EE_B EE_B' OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 3.1:
Variables: FE EE_A' EE_B'
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 3.3:
Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
============================
scopes_same (((X, V)::Scope)::EE) EE_B'
< case IsS.
Subgoal 3.3:
Variables: FE OA EE_B EE_B' OB EE Scope V X E Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvB : evalStmt FE EE_B (declare Ty X E) EE_B' OB
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
scopes_same (((X, V)::Scope)::EE) EE_B'
< EvB: case EvB.
Subgoal 3.3:
Variables: FE OA OB EE Scope V X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) OA @
EvA1 : evalExpr FE (Scope::EE) E V OA *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
scopes_same (((X, V)::Scope)::EE) (((X, V1)::Scope1)::EE1)
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.3:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
SS : scopes_same (Scope::EE) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
============================
scopes_same (((X, V1)::Scope)::EE) (((X, V1)::Scope1)::EE1)
< SS: case SS.
Subgoal 3.3:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
scopes_same (((X, V1)::Scope)::EE) (((X, V1)::Scope1)::EE1)
< unfold .
Subgoal 3.3.1:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
forall X1 V, lookup ((X, V1)::Scope) X1 V -> lookup ((X, V1)::Scope1) X1 V
< intros L.
Subgoal 3.3.1:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : lookup ((X, V1)::Scope) X1 V2
============================
lookup ((X, V1)::Scope1) X1 V2
< L: case L.
Subgoal 3.3.1.1:
Variables: FE OB EE Scope E Ty EE1 Scope1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X1 E) (((X1, V2)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V2 OB *
H1 : is_typ Ty
H2 : is_string X1
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V2 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
lookup ((X1, V2)::Scope1) X1 V2
< search.
Subgoal 3.3.1.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope X1 V2
============================
lookup ((X, V1)::Scope1) X1 V2
< apply SS to L1.
Subgoal 3.3.1.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope X1 V2
H4 : lookup Scope1 X1 V2
============================
lookup ((X, V1)::Scope1) X1 V2
< search.
Subgoal 3.3.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
forall X1 V, lookup ((X, V1)::Scope1) X1 V -> lookup ((X, V1)::Scope) X1 V
< intros L.
Subgoal 3.3.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : lookup ((X, V1)::Scope1) X1 V2
============================
lookup ((X, V1)::Scope) X1 V2
< L: case L.
Subgoal 3.3.2.1:
Variables: FE OB EE Scope E Ty EE1 Scope1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X1 E) (((X1, V2)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V2 OB *
H1 : is_typ Ty
H2 : is_string X1
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V2 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
lookup ((X1, V2)::Scope) X1 V2
< search.
Subgoal 3.3.2.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope1 X1 V2
============================
lookup ((X, V1)::Scope) X1 V2
< apply SS1 to L1.
Subgoal 3.3.2.2:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1 X1 V2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
L : X = X1 -> false
L1 : lookup Scope1 X1 V2
H4 : lookup Scope X1 V2
============================
lookup ((X, V1)::Scope) X1 V2
< search.
Subgoal 3.3.3:
Variables: FE OB EE Scope X E Ty EE1 Scope1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V1)::Scope)::EE) OB @
EvA1 : evalExpr FE (Scope::EE) E V1 OB *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (Scope1::EE1) E V1 OB
SS : forall X V, lookup Scope X V -> lookup Scope1 X V
SS1 : forall X V, lookup Scope1 X V -> lookup Scope X V
SS2 : scopes_same EE EE1
============================
scopes_same EE EE1
< search.
Subgoal 3.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.4:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V E X V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : replaceScopes X V1 EE_B EE_B'
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.4:
Variables: FE EE_A EE_A' EE_B EE_B' OB E X V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : replaceScopes X V1 EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : replaceScopes X V1 EE_B EE_B'
============================
scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA2 EvB1.
Subgoal 3.4:
Variables: FE EE_A EE_A' EE_B EE_B' OB E X V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : replaceScopes X V1 EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : replaceScopes X V1 EE_B EE_B'
H3 : scopes_same EE_A' EE_B'
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A 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 3.5:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB V FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OA *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB FieldVals NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V1 FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
============================
scopes_same EE_A' EE_B'
< apply scopes_same_lookupScopes to _ _ _ EvA2 EvB1.
Subgoal 3.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
============================
scopes_same EE_A' EE_B'
< apply lookupScopes_is to _ EvA2.
Subgoal 3.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB NewVals E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
H4 : is_value (recVal FieldVals1)
H5 : is_string Rec
============================
scopes_same EE_A' EE_B'
< apply updateRecFields_unique to EvA3 EvB2.
Subgoal 3.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
H4 : is_value (recVal FieldVals1)
H5 : is_string Rec
============================
scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA4 EvB3.
Subgoal 3.5:
Variables: FE EE_A EE_A' EE_B EE_B' OB E Fields Rec V1 FieldVals1 NewVals1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 OB *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals1)
EvA3 : updateRecFields Fields V1 FieldVals1 NewVals1
EvA4 : replaceScopes Rec (recVal NewVals1) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V1 OB
EvB1 : lookupScopes Rec EE_B (recVal FieldVals1)
EvB2 : updateRecFields Fields V1 FieldVals1 NewVals1
EvB3 : replaceScopes Rec (recVal NewVals1) EE_B EE_B'
H4 : is_value (recVal FieldVals1)
H5 : is_string Rec
H6 : scopes_same EE_A' EE_B'
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.6:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Th (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.6:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 3.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS.
Subgoal 3.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
============================
scopes_same EE_A' EE_B'
< SS': apply IH_S_C to _ _ _ _ _ EvA2 EvB1.
Subgoal 3.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
SS' : scopes_same (Scope::EE_A') (Scope1::EE_B')
============================
scopes_same EE_A' EE_B'
< case SS'.
Subgoal 3.6.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
H5 : forall X V, lookup Scope X V -> lookup Scope1 X V
H6 : forall X V, lookup Scope1 X V -> lookup Scope X V
H7 : scopes_same EE_A' EE_B'
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.6.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.7:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) El (Scope::EE_A') O2 *
EvA3 : O1 ++ O2 = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.7:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 3.7.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) Th (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
============================
scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS.
Subgoal 3.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
============================
scopes_same EE_A' EE_B'
< SS': apply IH_S_C to _ _ _ _ _ EvA2 EvB1.
Subgoal 3.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
SS' : scopes_same (Scope::EE_A') (Scope1::EE_B')
============================
scopes_same EE_A' EE_B'
< case SS'.
Subgoal 3.7.2:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope O2 El Th Cond O3 Scope1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) 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 O3
EvB1 : evalStmt FE ([]::EE_B) El (Scope1::EE_B') O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same ([]::EE_A) ([]::EE_B)
H5 : forall X V, lookup Scope X V -> lookup Scope1 X V
H6 : forall X V, lookup Scope1 X V -> lookup Scope X V
H7 : scopes_same EE_A' EE_B'
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.8:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (while Cond Body) EE_A' O3 *
EvA4 : O1 ++ O2 = O12
EvA5 : O12 ++ O3 = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.8:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
============================
scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
============================
scopes_same EE_A' EE_B'
< SS1: apply IH_S_C to _ _ _ _ _ EvA2 EvB1.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
SS1 : scopes_same (Scope::EE1) (Scope1::EE2)
============================
scopes_same EE_A' EE_B'
< case SS1.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
============================
scopes_same EE_A' EE_B'
< IsEE1+: apply evalStmt_isCtx to _ _ _ EvA2.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
scopes_same EE_A' EE_B'
< case IsEE1+.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
============================
scopes_same EE_A' EE_B'
< IsEE2+: apply evalStmt_isCtx to _ _ _ EvB1.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
scopes_same EE_A' EE_B'
< case IsEE2+.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
============================
scopes_same EE_A' EE_B'
< apply IH_S_C to _ _ _ _ _ EvA3 EvB2.
Subgoal 3.8.1:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond O4 Scope1 EE2 O5 O6 O7
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 O4
EvB1 : evalStmt FE ([]::EE_B) Body (Scope1::EE2) O5
EvB2 : evalStmt FE EE2 (while Cond Body) EE_B' O6
EvB3 : O4 ++ O5 = O7
EvB4 : O7 ++ O6 = OB
H3 : scopes_same ([]::EE_A) ([]::EE_B)
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
H11 : scopes_same EE_A' EE_B'
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.8.2:
Variables: FE EE_A EE_A' OA EE_B' OB O1 Scope EE1 O2 O3 O12 Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O1 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O2 *
EvA3 : evalStmt FE EE1 (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 OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.9:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 OA *
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.9:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.9.1:
Variables: FE EE_A' OA EE_B EE_B' OB Body Cond O1 Scope EE1 O2 O3 O12
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
EvB : evalExpr FE EE_B Cond trueVal O1
EvB1 : evalStmt FE ([]::EE_B) Body (Scope::EE1) O2
EvB2 : evalStmt FE EE1 (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 3.9.2:
Variables: FE EE_A' OA EE_B' OB Body Cond
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 OA *
H1 : is_expr Cond
H2 : is_stmt Body
EvB : evalExpr FE EE_B' Cond falseVal OB
============================
scopes_same EE_A' EE_B'
< 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 3.10:
Variables: FE EE_A EE_A' OA EE_B EE_B' OB Scope S1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 3.11:
Variables: FE EE_A' OA EE_B EE_B' OB I O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) O1 *
EvA2 : O1 ++ [intVal I] = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.11:
Variables: FE EE_A' OA EE_B EE_B' OB I O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.11.1:
Variables: FE EE_A' OA EE_B' OB I O1 E I1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I1) O2
EvB1 : O2 ++ [intVal I1] = OB
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.11.2:
Variables: FE EE_A' OA EE_B' OB I O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.11.3:
Variables: FE EE_A' OA EE_B' OB I O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.11.4:
Variables: FE EE_A' OA EE_B' OB I O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [intVal I] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.12:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : O1 ++ [trueVal] = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.12:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.12.1:
Variables: FE EE_A' OA EE_B' OB O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.12.2:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.12.3:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.12.4:
Variables: FE EE_A' OA EE_B' OB O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [trueVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.13:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 O1 *
EvA2 : O1 ++ [falseVal] = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.13:
Variables: FE EE_A' OA EE_B EE_B' OB O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.13.1:
Variables: FE EE_A' OA EE_B' OB O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.13.2:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.13.3:
Variables: FE EE_A' OA EE_B' OB O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 3.13.4:
Variables: FE EE_A' OA EE_B' OB O1 E S1 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O1 *
EvA2 : O1 ++ [falseVal] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S1) O2
EvB1 : O2 ++ [stringVal S1] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.14:
Variables: FE EE_A' OA EE_B EE_B' OB S1 O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
============================
scopes_same EE_A' EE_B'
< case IsS.
Subgoal 3.14:
Variables: FE EE_A' OA EE_B EE_B' OB S1 O1 E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.14.1:
Variables: FE EE_A' OA EE_B' OB S1 O1 E I O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (intVal I) O2
EvB1 : O2 ++ [intVal I] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.14.2:
Variables: FE EE_A' OA EE_B' OB S1 O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E trueVal O2
EvB1 : O2 ++ [trueVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.14.3:
Variables: FE EE_A' OA EE_B' OB S1 O1 E O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E falseVal O2
EvB1 : O2 ++ [falseVal] = OB
============================
scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 3.14.4:
Variables: FE EE_A' OA EE_B' OB S1 O1 E S2 O2
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O1 *
EvA2 : O1 ++ [stringVal S1] = OA
H1 : is_expr E
EvB : evalExpr FE EE_B' E (stringVal S2) O2
EvB1 : O2 ++ [stringVal S2] = OB
============================
scopes_same EE_A' EE_B'
< search.
Subgoal 4.1:
Variables: FE EE_A EE_B VB OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] [] @
EvB : evalArgs FE EE_B nilArgs VB OB
============================
[] = VB /\ [] = OB
< case EvB.
Subgoal 4.1:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 [] [] @
============================
[] = [] /\ [] = []
< search.
Subgoal 4.2:
Variables: FE EE_A OA EE_B VB OB O1 O2 VRest V Rest E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
============================
V::VRest = VB /\ OA = OB
< case IsA.
Subgoal 4.2:
Variables: FE EE_A OA EE_B VB OB O1 O2 VRest V Rest E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvB : evalArgs FE EE_B (consArgs E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
============================
V::VRest = VB /\ OA = OB
< EvB: case EvB.
Subgoal 4.2:
Variables: FE EE_A OA EE_B OB O1 O2 VRest V Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
V::VRest = V1::VRest1 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 4.2:
Variables: FE EE_A OA EE_B OB O2 VRest Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
V1::VRest = V1::VRest1 /\ OA = OB
< apply IH_A to _ _ _ _ _ EvA2 EvB1.
Subgoal 4.2:
Variables: FE EE_A OA EE_B OB Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OA @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest1 O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
V1::VRest1 = V1::VRest1 /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 4.2:
Variables: FE EE_A EE_B OB Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) OB @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalArgs FE EE_A Rest VRest1 O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E
H2 : is_args Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalArgs FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
V1::VRest1 = V1::VRest1 /\ OB = OB
< search.
Subgoal 5.1:
Variables: FE EE_A EE_B VB OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 nilRecFieldVals [] @
EvB : evalRecFields FE EE_B nilRecFieldExprs VB OB
============================
nilRecFieldVals = VB /\ [] = OB
< case EvB.
Subgoal 5.1:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 nilRecFieldVals [] @
============================
nilRecFieldVals = nilRecFieldVals /\ [] = []
< search.
Subgoal 5.2:
Variables: FE EE_A OA EE_B VB OB O1 O2 VRest V F Rest E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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) (consRecFieldVals F V VRest) OA @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
============================
consRecFieldVals F V VRest = VB /\ OA = OB
< case IsRF.
Subgoal 5.2:
Variables: FE EE_A OA EE_B VB OB O1 O2 VRest V F Rest E
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V VRest) OA @
EvB : evalRecFields FE EE_B (consRecFieldExprs F E Rest) VB OB
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
============================
consRecFieldVals F V VRest = VB /\ OA = OB
< EvB: case EvB.
Subgoal 5.2:
Variables: FE EE_A OA EE_B OB O1 O2 VRest V F Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V VRest) OA @
EvA1 : evalExpr FE EE_A E V O1 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
consRecFieldVals F V VRest = consRecFieldVals F V1 VRest1 /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB.
Subgoal 5.2:
Variables: FE EE_A OA EE_B OB O2 VRest F Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest) OA @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
consRecFieldVals F V1 VRest = consRecFieldVals F V1 VRest1 /\ OA = OB
< apply IH_RF to _ _ _ _ _ EvA2 EvB1.
Subgoal 5.2:
Variables: FE EE_A OA EE_B OB F Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest1) OA @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest1 O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
consRecFieldVals F V1 VRest1 = consRecFieldVals F V1 VRest1 /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 5.2:
Variables: FE EE_A EE_B OB F Rest E O3 O4 VRest1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA OA EE_B VB OB,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest1) OB @
EvA1 : evalExpr FE EE_A E V1 O3 *
EvA2 : evalRecFields FE EE_A Rest VRest1 O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB : evalExpr FE EE_B E V1 O3
EvB1 : evalRecFields FE EE_B Rest VRest1 O4
EvB2 : O3 ++ O4 = OB
============================
consRecFieldVals F V1 VRest1 = consRecFieldVals F V1 VRest1 /\ OB = OB
< search.
Proof completed.
< Extensible_Theorem
evalExpr_scopes_same_exists : forall E FE EE_A V 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 O ->
evalExpr FE EE_B E V 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 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 O ->
evalArgs FE EE_B A V O
on EvA as IH_A,
evalRecFields_scopes_same_exists : forall RF FE EE_A V 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 O ->
evalRecFields FE EE_B RF V O
on EvA as IH_RF.
Subgoal 1.1:
Variables: FE EE_A EE_B I
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) [] @
============================
evalExpr FE EE_B (num I) (intVal I) []
< search.
Subgoal 1.2:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 + I2 = I
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (plus E1 E2) (intVal I) O
< case IsE.
Subgoal 1.2:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 + I2 = I
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (plus E1 E2) (intVal I) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.2:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
============================
evalExpr FE EE_B (plus E1 E2) (intVal I) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.2:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (plus E1 E2) (intVal I) O
< search.
Subgoal 1.3:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 - I2 = I
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (minus E1 E2) (intVal I) O
< case IsE.
Subgoal 1.3:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 - I2 = I
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (minus E1 E2) (intVal I) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.3:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
============================
evalExpr FE EE_B (minus E1 E2) (intVal I) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.3:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (minus E1 E2) (intVal I) O
< search.
Subgoal 1.4:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 * I2 = I
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (mult E1 E2) (intVal I) O
< case IsE.
Subgoal 1.4:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 * I2 = I
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (mult E1 E2) (intVal I) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.4:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
============================
evalExpr FE EE_B (mult E1 E2) (intVal I) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.4:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (mult E1 E2) (intVal I) O
< search.
Subgoal 1.5:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 / I2 = I
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (div E1 E2) (intVal I) O
< case IsE.
Subgoal 1.5:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 / I2 = I
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (div E1 E2) (intVal I) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.5:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
============================
evalExpr FE EE_B (div E1 E2) (intVal I) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.5:
Variables: FE EE_A O EE_B I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) 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) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (div E1 E2) (intVal I) O
< search.
Subgoal 1.6:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 [] @
============================
evalExpr FE EE_B true trueVal []
< search.
Subgoal 1.7:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 [] @
============================
evalExpr FE EE_B false falseVal []
< search.
Subgoal 1.8:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (and E1 E2) trueVal O
< case IsE.
Subgoal 1.8:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (and E1 E2) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.8:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 trueVal O2
============================
evalExpr FE EE_B (and E1 E2) trueVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.8:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 trueVal O2
EvB2 : evalExpr FE EE_B E2 trueVal O3
============================
evalExpr FE EE_B (and E1 E2) trueVal O
< search.
Subgoal 1.9:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< case IsE.
Subgoal 1.9:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.9:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 falseVal O
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< search.
Subgoal 1.10:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< case IsE.
Subgoal 1.10:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.10:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 trueVal O2
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.10:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 trueVal O2
EvB2 : evalExpr FE EE_B E2 falseVal O3
============================
evalExpr FE EE_B (and E1 E2) falseVal O
< search.
Subgoal 1.11:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< case IsE.
Subgoal 1.11:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.11:
Variables: FE EE_A O EE_B E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 trueVal O
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< search.
Subgoal 1.12:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< case IsE.
Subgoal 1.12:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.12:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 falseVal O2
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.12:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 trueVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 falseVal O2
EvB2 : evalExpr FE EE_B E2 trueVal O3
============================
evalExpr FE EE_B (or E1 E2) trueVal O
< search.
Subgoal 1.13:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (or E1 E2) falseVal O
< case IsE.
Subgoal 1.13:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (or E1 E2) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.13:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 falseVal O2
============================
evalExpr FE EE_B (or E1 E2) falseVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.13:
Variables: FE EE_A O EE_B O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O2 *
EvA2 : evalExpr FE EE_A E2 falseVal O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 falseVal O2
EvB2 : evalExpr FE EE_B E2 falseVal O3
============================
evalExpr FE EE_B (or E1 E2) falseVal O
< search.
Subgoal 1.14:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
============================
evalExpr FE EE_B (not E1) trueVal O
< case IsE.
Subgoal 1.14:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
H1 : is_expr E1
============================
evalExpr FE EE_B (not E1) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.14:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 falseVal O *
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 falseVal O
============================
evalExpr FE EE_B (not E1) trueVal O
< search.
Subgoal 1.15:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
============================
evalExpr FE EE_B (not E1) falseVal O
< case IsE.
Subgoal 1.15:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
H1 : is_expr E1
============================
evalExpr FE EE_B (not E1) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.15:
Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 trueVal O *
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 trueVal O
============================
evalExpr FE EE_B (not E1) falseVal O
< search.
Subgoal 1.16:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 > I2
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (greater E1 E2) trueVal O
< case IsE.
Subgoal 1.16:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 > I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (greater E1 E2) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.16:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 > I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 (intVal I1) O2
============================
evalExpr FE EE_B (greater E1 E2) trueVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.16:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 > I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 (intVal I1) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (greater E1 E2) trueVal O
< search.
Subgoal 1.17:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 <= I2
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (greater E1 E2) falseVal O
< case IsE.
Subgoal 1.17:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 <= I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (greater E1 E2) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.17:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 <= I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 (intVal I1) O2
============================
evalExpr FE EE_B (greater E1 E2) falseVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.17:
Variables: FE EE_A O EE_B I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 (intVal I1) O2 *
EvA2 : evalExpr FE EE_A E2 (intVal I2) O3 *
EvA3 : I1 <= I2
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 (intVal I1) O2
EvB2 : evalExpr FE EE_B E2 (intVal I2) O3
============================
evalExpr FE EE_B (greater E1 E2) falseVal O
< search.
Subgoal 1.18:
Variables: FE EE_A O EE_B V1 O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V1 O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (eq E1 E2) trueVal O
< case IsE.
Subgoal 1.18:
Variables: FE EE_A O EE_B V1 O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V1 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (eq E1 E2) trueVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.18:
Variables: FE EE_A O EE_B V1 O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V1 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 O2
============================
evalExpr FE EE_B (eq E1 E2) trueVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.18:
Variables: FE EE_A O EE_B V1 O2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V1 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 O2
EvB2 : evalExpr FE EE_B E2 V1 O3
============================
evalExpr FE EE_B (eq E1 E2) trueVal O
< search.
Subgoal 1.19:
Variables: FE EE_A O EE_B V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : V1 = V2 -> false
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (eq E1 E2) falseVal O
< case IsE.
Subgoal 1.19:
Variables: FE EE_A O EE_B V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : V1 = V2 -> false
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (eq E1 E2) falseVal O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.19:
Variables: FE EE_A O EE_B V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : V1 = V2 -> false
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 O2
============================
evalExpr FE EE_B (eq E1 E2) falseVal O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.19:
Variables: FE EE_A O EE_B V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : V1 = V2 -> false
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 O2
EvB2 : evalExpr FE EE_B E2 V2 O3
============================
evalExpr FE EE_B (eq E1 E2) falseVal O
< search.
Subgoal 1.20:
Variables: FE EE_A EE_B S
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) [] @
============================
evalExpr FE EE_B (stringLit S) (stringVal S) []
< search.
Subgoal 1.21:
Variables: FE EE_A O EE_B S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O2 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O3 *
EvA3 : S1 ++ S2 = S
EvA4 : O2 ++ O3 = O
============================
evalExpr FE EE_B (appString E1 E2) (stringVal S) O
< case IsE.
Subgoal 1.21:
Variables: FE EE_A O EE_B S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O2 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) O3 *
EvA3 : S1 ++ S2 = S
EvA4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
evalExpr FE EE_B (appString E1 E2) (stringVal S) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.21:
Variables: FE EE_A O EE_B S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O2 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O2
============================
evalExpr FE EE_B (appString E1 E2) (stringVal S) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.21:
Variables: FE EE_A O EE_B S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalExpr FE EE_A E1 (stringVal S1) O2 *
EvA2 : evalExpr FE EE_A E2 (stringVal S2) 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) O2
EvB2 : evalExpr FE EE_B E2 (stringVal S2) O3
============================
evalExpr FE EE_B (appString E1 E2) (stringVal S) O
< search.
Subgoal 1.22:
Variables: FE EE_A V EE_B X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 [] @
EvA1 : lookupScopes X EE_A V
============================
evalExpr FE EE_B (name X) V []
< case IsE.
Subgoal 1.22:
Variables: FE EE_A V EE_B X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 [] @
EvA1 : lookupScopes X EE_A V
H1 : is_string X
============================
evalExpr FE EE_B (name X) V []
< apply scopes_same_lookupScopes_exists to _ _ SS EvA1.
Subgoal 1.22:
Variables: FE EE_A V EE_B X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 [] @
EvA1 : lookupScopes X EE_A V
H1 : is_string X
H2 : lookupScopes X EE_B V
============================
evalExpr FE EE_B (name X) V []
< search.
Subgoal 1.23:
Variables: FE EE_A V O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O2 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 *
EvA5 : O2 ++ O3 = O
EvA6 : lookupScopes RetVar EE1 V
============================
evalExpr FE EE_B (call Fun Args) V O
< case IsE.
Subgoal 1.23:
Variables: FE EE_A V O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O2 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 *
EvA5 : O2 ++ O3 = O
EvA6 : lookupScopes RetVar EE1 V
H1 : is_string Fun
H2 : is_args Args
============================
evalExpr FE EE_B (call Fun Args) V O
< EvB: apply IH_A to _ _ _ _ SS EvA2.
Subgoal 1.23:
Variables: FE EE_A V O EE_B RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE1 O3 Args Fun
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
EvA2 : evalArgs FE EE_A Args ArgVals O2 *
EvA3 : zip ArgNames ArgVals InitEnv
EvA4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE1 O3 *
EvA5 : O2 ++ O3 = O
EvA6 : lookupScopes RetVar EE1 V
H1 : is_string Fun
H2 : is_args Args
EvB : evalArgs FE EE_B Args ArgVals O2
============================
evalExpr FE EE_B (call Fun Args) V O
< search.
Subgoal 1.24:
Variables: FE EE_A O EE_B VF RF
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalRecFields FE EE_A RF VF O *
============================
evalExpr FE EE_B (recBuild RF) (recVal VF) O
< case IsE.
Subgoal 1.24:
Variables: FE EE_A O EE_B VF RF
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalRecFields FE EE_A RF VF O *
H1 : is_recFieldExprs RF
============================
evalExpr FE EE_B (recBuild RF) (recVal VF) O
< apply IH_RF to _ _ _ _ SS EvA1.
Subgoal 1.24:
Variables: FE EE_A O EE_B VF RF
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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) O @
EvA1 : evalRecFields FE EE_A RF VF O *
H1 : is_recFieldExprs RF
H2 : evalRecFields FE EE_B RF VF O
============================
evalExpr FE EE_B (recBuild RF) (recVal VF) O
< search.
Subgoal 1.25:
Variables: FE EE_A V O EE_B Fields F Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O *
EvA2 : lookupRecFieldVal Fields F V
============================
evalExpr FE EE_B (recFieldAccess Rec F) V O
< case IsE.
Subgoal 1.25:
Variables: FE EE_A V O EE_B Fields F Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O *
EvA2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
evalExpr FE EE_B (recFieldAccess Rec F) V O
< apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.25:
Variables: FE EE_A V O EE_B Fields F Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O @
EvA1 : evalExpr FE EE_A Rec (recVal Fields) O *
EvA2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
H3 : evalExpr FE EE_B Rec (recVal Fields) O
============================
evalExpr FE EE_B (recFieldAccess Rec F) V O
< search.
Subgoal 2.1:
Variables: FE EE_A' EE_B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O EE_B EE Scope V X E Ty
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
============================
exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< case IsS.
Subgoal 2.3:
Variables: FE O EE_B EE Scope V X E Ty
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V 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 O EE_B EE Scope V X E Ty
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same (Scope::EE) EE_B
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE EE_B E V O
============================
exists EE_B', evalStmt FE EE_B (declare Ty X E) EE_B' O
< case SS.
Subgoal 2.3:
Variables: FE O EE Scope V X E Ty BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
IsB : is_list (is_list (is_pair is_string is_value)) (B::BRest)
EvA : evalStmt FE (Scope::EE) (declare Ty X E) (((X, V)::Scope)::EE) O @
EvA1 : evalExpr FE (Scope::EE) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
EvB : evalExpr FE (B::BRest) E V O
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 EE BRest
============================
exists EE_B', evalStmt FE (B::BRest) (declare Ty X E) EE_B' O
< search.
Subgoal 2.4:
Variables: FE EE_A EE_A' O EE_B V E X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O *
EvA2 : replaceScopes X V EE_A 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 E X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : replaceScopes X V EE_A 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 E X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V O
============================
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 E X B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : replaceScopes X V EE_A EE_A'
H1 : is_string X
H2 : is_expr E
EvB : evalExpr FE EE_B E V O
H3 : 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 FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A 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 FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A 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 FieldVals NewVals E Fields Rec
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V O
============================
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 FieldVals NewVals E Fields Rec B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V O
H4 : 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 FieldVals NewVals E Fields Rec B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O *
EvA2 : lookupScopes Rec EE_A (recVal FieldVals)
EvA3 : updateRecFields Fields V FieldVals NewVals
EvA4 : replaceScopes Rec (recVal NewVals) EE_A EE_A'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
EvB : evalExpr FE EE_B E V O
H4 : replaceScopes Rec (recVal NewVals) EE_B B'
H5 : 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
============================
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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 O2 Scope O3 El Th Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) Th EE_B' 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 O2 Scope O3 El Th Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) Th EE_B' O3
SS2 : scopes_same (Scope::EE_A') EE_B'
============================
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 O2 Scope O3 El Th Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) Th (B::BRest) O3
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 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
============================
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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 O2 Scope O3 El Th Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) El EE_B' 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 O2 Scope O3 El Th Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) El EE_B' O3
SS2 : scopes_same (Scope::EE_A') EE_B'
============================
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 O2 Scope O3 El Th Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) 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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) El (B::BRest) O3
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 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 O2 Scope EE1 O3 O4 O12 Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2 Scope EE1 O3 O4 O12 Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2 Scope EE1 O3 O4 O12 Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
============================
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 O2 Scope EE1 O3 O4 O12 Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 O2 Scope EE1 O3 O4 O12 Body Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) Body EE_B' 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 O2 Scope EE1 O3 O4 O12 Body Cond EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::EE_B)
EvB2 : evalStmt FE ([]::EE_B) Body EE_B' O3
SS2 : scopes_same (Scope::EE1) EE_B'
============================
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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 BRest
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 BRest
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 BRest
IsBR+ : is_list (is_list (is_pair is_string is_value)) (B::BRest)
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 BRest
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) B
H6 : 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 O2 Scope EE1 O3 O4 O12 Body Cond BRest B EE_B'1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 O2 *
EvA2 : evalStmt FE ([]::EE_A) Body (Scope::EE1) O3 *
EvA3 : evalStmt FE EE1 (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 O2
SS1 : scopes_same ([]::EE_A) ([]::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 EE1 BRest
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) B
H6 : is_list (is_list (is_pair is_string is_value)) BRest
H7 : evalStmt FE BRest (while Cond Body) EE_B'1 O4
============================
exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< search.
Subgoal 2.9:
Variables: FE EE_A' O EE_B Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O *
============================
exists EE_B', evalStmt FE EE_B (while Cond Body) EE_B' O
< case IsS.
Subgoal 2.9:
Variables: FE EE_A' O EE_B Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 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' O EE_B Body Cond
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O *
H1 : is_expr Cond
H2 : is_stmt Body
H3 : evalExpr FE EE_B Cond falseVal 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : 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' O EE_B I O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) 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' O EE_B I O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) 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' O EE_B I O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [intVal I] = O
H1 : is_expr E
H2 : evalExpr FE EE_B E (intVal I) O2
============================
exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search.
Subgoal 2.12:
Variables: FE EE_A' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 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' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 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' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [trueVal] = O
H1 : is_expr E
H2 : evalExpr FE EE_B E trueVal O2
============================
exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search.
Subgoal 2.13:
Variables: FE EE_A' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 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' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 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' O EE_B O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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 O2 *
EvA2 : O2 ++ [falseVal] = O
H1 : is_expr E
H2 : evalExpr FE EE_B E falseVal O2
============================
exists EE_B', evalStmt FE EE_B (printVal E) EE_B' O
< search.
Subgoal 2.14:
Variables: FE EE_A' O EE_B S1 O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) 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' O EE_B S1 O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) 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' O EE_B S1 O2 E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : 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) O2 *
EvA2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
H2 : evalExpr FE EE_B E (stringVal S1) 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 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 [] [] @
============================
evalArgs FE EE_B nilArgs [] []
< search.
Subgoal 3.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalArgs FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
============================
evalArgs FE EE_B (consArgs E Rest) (V1::VRest) O
< case IsA.
Subgoal 3.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
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) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalArgs FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
============================
evalArgs FE EE_B (consArgs E Rest) (V1::VRest) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 3.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
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) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalArgs FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
EvB1 : evalExpr FE EE_B E V1 O2
============================
evalArgs FE EE_B (consArgs E Rest) (V1::VRest) O
< apply IH_A to _ _ _ _ SS EvA2.
Subgoal 3.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
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) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalArgs FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
EvB1 : evalExpr FE EE_B E V1 O2
H3 : evalArgs FE EE_B Rest VRest O3
============================
evalArgs FE EE_B (consArgs E Rest) (V1::VRest) O
< search.
Subgoal 4.1:
Variables: FE EE_A EE_B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 nilRecFieldVals [] @
============================
evalRecFields FE EE_B nilRecFieldExprs nilRecFieldVals []
< search.
Subgoal 4.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 F Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) (consRecFieldVals F V1 VRest) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalRecFields FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
============================
evalRecFields FE EE_B (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< case IsRF.
Subgoal 4.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 F Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalRecFields FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
============================
evalRecFields FE EE_B (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< EvB1: apply IH_E to _ _ _ _ SS EvA1.
Subgoal 4.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 F Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalRecFields FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB1 : evalExpr FE EE_B E V1 O2
============================
evalRecFields FE EE_B (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< apply IH_RF to _ _ _ _ SS EvA2.
Subgoal 4.2:
Variables: FE EE_A O EE_B O2 O3 VRest V1 F Rest E
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_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) (consRecFieldVals F V1 VRest) O @
EvA1 : evalExpr FE EE_A E V1 O2 *
EvA2 : evalRecFields FE EE_A Rest VRest O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
EvB1 : evalExpr FE EE_B E V1 O2
H4 : evalRecFields FE EE_B Rest VRest O3
============================
evalRecFields FE EE_B (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< search.
Proof completed.
< Projection_Constraint proj_evalExpr_exists :
forall E E' FE EE V O,
Pr : |{expr}- E ~~> E' ->
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 O ->
exists V',
evalExpr FE EE E' V' O.
Proof completed.
< Projection_Constraint proj_evalStmt_exists :
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.
Proof completed.
< Projection_Constraint proj_evalStmt_rel :
forall Names S S' FE EE EE' O EE_P O_P,
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 ->
Ev_P : evalStmt FE EE S' EE_P O_P ->
scopes_same EE' EE_P.
Proof completed.
< Ext_Ind forall FE EE E V O, evalExpr FE EE E V 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 O, evalArgs FE EE A V 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 O, evalRecFields FE EE RF V 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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) [] 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) []
< search.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 + I2 = I
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< Acc': case Acc (keep).
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Is: case IsE.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.2:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< LN2: case OrN2.
Subgoal 1.2.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< A2: apply Acc' to _ LN2.
Subgoal 1.2.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.2.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.2.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.2.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.2.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.2.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< search.
Subgoal 1.2.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.2.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< search.
Subgoal 1.2.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.2.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.2.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.2.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.2.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.2.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< search.
Subgoal 1.2.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.2.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (plus E1 E2) (intVal I) O
< search.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 - I2 = I
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< Acc': case Acc (keep).
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Is: case IsE.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.3:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< LN2: case OrN2.
Subgoal 1.3.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< A2: apply Acc' to _ LN2.
Subgoal 1.3.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.3.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.3.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.3.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.3.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.3.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< search.
Subgoal 1.3.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.3.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< search.
Subgoal 1.3.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.3.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.3.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.3.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.3.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.3.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< search.
Subgoal 1.3.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.3.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (minus E1 E2) (intVal I) O
< search.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 * I2 = I
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< Acc': case Acc (keep).
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Is: case IsE.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.4:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< LN2: case OrN2.
Subgoal 1.4.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< A2: apply Acc' to _ LN2.
Subgoal 1.4.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.4.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.4.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.4.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.4.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.4.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< search.
Subgoal 1.4.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.4.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< search.
Subgoal 1.4.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.4.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.4.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.4.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.4.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.4.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< search.
Subgoal 1.4.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.4.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (mult E1 E2) (intVal I) O
< search.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 / I2 = I
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< Acc': case Acc (keep).
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Is: case IsE.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.5:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< LN2: case OrN2.
Subgoal 1.5.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< A2: apply Acc' to _ LN2.
Subgoal 1.5.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.5.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.5.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.5.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.5.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.5.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< search.
Subgoal 1.5.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.5.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< search.
Subgoal 1.5.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.5.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.5.2:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< LN3: case OrN3.
Subgoal 1.5.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< A3: apply Acc' to _ LN3.
Subgoal 1.5.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.5.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< search.
Subgoal 1.5.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.5.2.2:
Variables: N FE EE O I1 O2 I2 O3 I E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (div E1 E2) (intVal I) O
< search.
Subgoal 1.6:
Variables: FE EE
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 [] 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 []
< search.
Subgoal 1.7:
Variables: FE EE
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 [] 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 []
< search.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< Acc': case Acc (keep).
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< Is: case IsE.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.8:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< LN2: case OrN2.
Subgoal 1.8.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.8.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.8.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.8.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.8.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.8.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.8.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< search.
Subgoal 1.8.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.8.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< search.
Subgoal 1.8.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.8.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.8.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.8.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.8.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.8.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< search.
Subgoal 1.8.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.8.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) trueVal O
< search.
Subgoal 1.9:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O N **
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< case IsE.
Subgoal 1.9:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R1 Acc _ _ _.
Subgoal 1.9:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : is_expr E2
H3 : <evalExpr {P}> FE EE E1 falseVal O
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< search.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< Acc': case Acc (keep).
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< Is: case IsE.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.10:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< LN2: case OrN2.
Subgoal 1.10.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.10.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.10.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.10.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.10.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.10.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.10.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< search.
Subgoal 1.10.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.10.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< search.
Subgoal 1.10.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.10.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.10.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.10.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.10.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.10.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< search.
Subgoal 1.10.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.10.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 trueVal O2
Ev : evalExpr FE EE E1 trueVal O2
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (and E1 E2) falseVal O
< search.
Subgoal 1.11:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O N **
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< case IsE.
Subgoal 1.11:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : is_expr E2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R1 Acc _ _ _.
Subgoal 1.11:
Variables: N FE EE O E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : is_expr E2
H3 : <evalExpr {P}> FE EE E1 trueVal O
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< search.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< Acc': case Acc (keep).
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< Is: case IsE.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.12:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< LN2: case OrN2.
Subgoal 1.12.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.12.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.12.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.12.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.12.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.12.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.12.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< search.
Subgoal 1.12.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.12.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< search.
Subgoal 1.12.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.12.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.12.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.12.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.12.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.12.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< search.
Subgoal 1.12.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.12.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 trueVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
H3 : <evalExpr {P}> FE EE E2 trueVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) trueVal O
< search.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< Acc': case Acc (keep).
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< Is: case IsE.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.13:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< LN2: case OrN2.
Subgoal 1.13.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.13.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.13.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.13.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.13.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.13.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.13.1.1:
Variables: N FE EE O N2 N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< search.
Subgoal 1.13.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.13.1.2:
Variables: N FE EE O N2 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< search.
Subgoal 1.13.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.13.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.13.2:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.13.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.13.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.13.2.1:
Variables: N FE EE O N3 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< search.
Subgoal 1.13.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.13.2.2:
Variables: N FE EE O O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 falseVal 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 O2
H2 : <evalExpr {P}> FE EE E1 falseVal O2
Ev : evalExpr FE EE E1 falseVal O2
H3 : <evalExpr {P}> FE EE E2 falseVal O3
============================
<evalExpr {P}> FE EE (or E1 E2) falseVal O
< search.
Subgoal 1.14:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O N **
============================
<evalExpr {P}> FE EE (not E1) trueVal O
< case IsE.
Subgoal 1.14:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
============================
<evalExpr {P}> FE EE (not E1) trueVal O
< apply IH4 to R1 Acc _ _ _.
Subgoal 1.14:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : <evalExpr {P}> FE EE E1 falseVal O
============================
<evalExpr {P}> FE EE (not E1) trueVal O
< search.
Subgoal 1.15:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O N **
============================
<evalExpr {P}> FE EE (not E1) falseVal O
< case IsE.
Subgoal 1.15:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
============================
<evalExpr {P}> FE EE (not E1) falseVal O
< apply IH4 to R1 Acc _ _ _.
Subgoal 1.15:
Variables: N FE EE O E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_expr E1
H2 : <evalExpr {P}> FE EE E1 trueVal O
============================
<evalExpr {P}> FE EE (not E1) falseVal O
< search.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 > I2
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< Acc': case Acc (keep).
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< Is: case IsE.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.16:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< LN2: case OrN2.
Subgoal 1.16.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.16.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.16.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.16.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.16.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.16.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.16.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< search.
Subgoal 1.16.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.16.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< search.
Subgoal 1.16.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.16.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.16.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.16.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.16.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.16.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< search.
Subgoal 1.16.2.2:
Variables: N FE EE O I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.16.2.2:
Variables: N FE EE O I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) trueVal O
< search.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) O3 N3 **
R4 : I1 <= I2
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< Acc': case Acc (keep).
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< Is: case IsE.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.17:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< LN2: case OrN2.
Subgoal 1.17.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.17.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.17.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.17.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.17.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.17.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.17.1.1:
Variables: N FE EE O N2 N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< search.
Subgoal 1.17.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.17.1.2:
Variables: N FE EE O N2 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< search.
Subgoal 1.17.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.17.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.17.2:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.17.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.17.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.17.2.1:
Variables: N FE EE O N3 I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< search.
Subgoal 1.17.2.2:
Variables: N FE EE O I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.17.2.2:
Variables: N FE EE O I1 O2 I2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (intVal I2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (intVal I1) O2
Ev : evalExpr FE EE E1 (intVal I1) O2
H3 : <evalExpr {P}> FE EE E2 (intVal I2) O3
============================
<evalExpr {P}> FE EE (greater E1 E2) falseVal O
< search.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< Acc': case Acc (keep).
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< Is: case IsE.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.18:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< LN2: case OrN2.
Subgoal 1.18.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.18.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.18.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.18.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.18.1.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.18.1.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.18.1.1:
Variables: N FE EE O N2 N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 V1 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< search.
Subgoal 1.18.1.2:
Variables: N FE EE O N2 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.18.1.2:
Variables: N FE EE O N2 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
H3 : <evalExpr {P}> FE EE E2 V1 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< search.
Subgoal 1.18.2:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.18.2:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.18.2:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< LN3: case OrN3.
Subgoal 1.18.2.1:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.18.2.1:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.18.2.1:
Variables: N FE EE O N3 V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 V1 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< search.
Subgoal 1.18.2.2:
Variables: N FE EE O V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.18.2.2:
Variables: N FE EE O V1 O2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V1 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
H3 : <evalExpr {P}> FE EE E2 V1 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) trueVal O
< search.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R4 : V1 = V2 -> false
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< Acc': case Acc (keep).
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< Is: case IsE.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.19:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< LN2: case OrN2.
Subgoal 1.19.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< A2: apply Acc' to _ LN2.
Subgoal 1.19.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.19.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.19.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.19.1.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.19.1.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.19.1.1:
Variables: N FE EE O N2 N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 V2 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< search.
Subgoal 1.19.1.2:
Variables: N FE EE O N2 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.19.1.2:
Variables: N FE EE O N2 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
H3 : <evalExpr {P}> FE EE E2 V2 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< search.
Subgoal 1.19.2:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.19.2:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.19.2:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< LN3: case OrN3.
Subgoal 1.19.2.1:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< A3: apply Acc' to _ LN3.
Subgoal 1.19.2.1:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.19.2.1:
Variables: N FE EE O N3 V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 V2 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< search.
Subgoal 1.19.2.2:
Variables: N FE EE O V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.19.2.2:
Variables: N FE EE O V1 O2 V2 O3 E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalExpr {ES}> FE EE E2 V2 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 O2
H2 : <evalExpr {P}> FE EE E1 V1 O2
Ev : evalExpr FE EE E1 V1 O2
H3 : <evalExpr {P}> FE EE E2 V2 O3
============================
<evalExpr {P}> FE EE (eq E1 E2) falseVal O
< search.
Subgoal 1.20:
Variables: FE EE S
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) [] 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) []
< search.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) O3 N3 **
R4 : S1 ++ S2 = S
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< Acc': case Acc (keep).
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< LE_N3: apply ext_size_pos_evalExpr to R3.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< apply ext_size_is_int_evalExpr to R3.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< Is: case IsE.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O
< Ev1: apply drop_ext_size_evalExpr to R2.
Subgoal 1.21:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< LN2: case OrN2.
Subgoal 1.21.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< A2: apply Acc' to _ LN2.
Subgoal 1.21.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R2 A2 _ _ _.
Subgoal 1.21.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.21.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< LN3: case OrN3.
Subgoal 1.21.1.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< A3: apply Acc' to _ LN3.
Subgoal 1.21.1.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.21.1.1:
Variables: N FE EE O N2 N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (stringVal S2) O3
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< search.
Subgoal 1.21.1.2:
Variables: N FE EE O N2 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.21.1.2:
Variables: N FE EE O N2 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N2 **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
H3 : <evalExpr {P}> FE EE E2 (stringVal S2) O3
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< search.
Subgoal 1.21.2:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 1.21.2:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 1.21.2:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< LN3: case OrN3.
Subgoal 1.21.2.1:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< A3: apply Acc' to _ LN3.
Subgoal 1.21.2.1:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R3 A3 _ _ _.
Subgoal 1.21.2.1:
Variables: N FE EE O N3 S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalExpr {P}> FE EE E2 (stringVal S2) O3
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< search.
Subgoal 1.21.2.2:
Variables: N FE EE O S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< apply IH4 to R3 Acc _ _ _.
Subgoal 1.21.2.2:
Variables: N FE EE O S1 O2 S2 O3 S E2 E1
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O2 N **
R3 : <evalExpr {ES}> FE EE E2 (stringVal S2) 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) O2
H2 : <evalExpr {P}> FE EE E1 (stringVal S1) O2
Ev : evalExpr FE EE E1 (stringVal S1) O2
H3 : <evalExpr {P}> FE EE E2 (stringVal S2) O3
============================
<evalExpr {P}> FE EE (appString E1 E2) (stringVal S) O
< search.
Subgoal 1.22:
Variables: FE EE V X
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 [] 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 []
< search.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 V
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< Acc': case Acc (keep).
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 V
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< LE_N2: apply ext_size_pos_evalArgs to R3.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 V
Acc' : forall M, 0 <= M -> M < N -> acc M *
LE_N2 : 0 <= N2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< LE_N3: apply ext_size_pos_evalStmt to R5.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< OrN2: apply lt_left to R1 _ _.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< apply ext_size_is_int_evalStmt to R5.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< Is: case IsE.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< IsFP: apply lookup_is_value_funCtx to _ R2.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< IsFP: case IsFP.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< IsFP: case IsFP1.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< IsFP: case IsFP2.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O
< EvA: apply drop_ext_size_evalArgs to R3.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply evalArgs_isValue to _ _ _ EvA.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply zip_is to _ _ R4.
Subgoal 1.23:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O
< LN2: case OrN2.
Subgoal 1.23.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O
< A2: apply Acc' to _ LN2.
Subgoal 1.23.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O
< apply IH5 to R3 A2 _ _ _.
Subgoal 1.23.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< LN3: case OrN3.
Subgoal 1.23.1.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< A3: apply Acc' to _ LN3.
Subgoal 1.23.1.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply IH7 to R5 A3 _ _ _.
Subgoal 1.23.1.1:
Variables: N FE EE V O N2 N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
LN3 : N3 < N
A3 : acc N3 *
H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< search.
Subgoal 1.23.1.2:
Variables: N FE EE V O N2 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply IH7 to R5 Acc _ _ _.
Subgoal 1.23.1.2:
Variables: N FE EE V O N2 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O2
H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< search.
Subgoal 1.23.2:
Variables: N FE EE V O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 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 O
< apply IH5 to R3 Acc _ _ _.
Subgoal 1.23.2:
Variables: N FE EE V O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< LN3: case OrN3.
Subgoal 1.23.2.1:
Variables: N FE EE V O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< A3: apply Acc' to _ LN3.
Subgoal 1.23.2.1:
Variables: N FE EE V O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply IH7 to R5 A3 _ _ _.
Subgoal 1.23.2.1:
Variables: N FE EE V O N3 RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N3 **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
LN3 : N3 < N
A3 : acc N3 *
H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< search.
Subgoal 1.23.2.2:
Variables: N FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< apply IH7 to R5 Acc _ _ _.
Subgoal 1.23.2.2:
Variables: N FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R4 : zip ArgNames ArgVals InitEnv
R5 : <evalStmt {ES}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 N **
R6 : O2 ++ O3 = O
R7 : lookupScopes RetVar EE2 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 O2
H2 : is_list is_value ArgVals
H3 : is_list (is_pair is_string is_value) InitEnv
H4 : <evalArgs {P}> FE EE Args ArgVals O2
H5 : <evalStmt {P}> FE [(RetVar, RVVal)::InitEnv] Body EE2 O3
============================
<evalExpr {P}> FE EE (call Fun Args) V O
< search.
Subgoal 1.24:
Variables: N FE EE O VF RF
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O N **
============================
<evalExpr {P}> FE EE (recBuild RF) (recVal VF) O
< case IsE.
Subgoal 1.24:
Variables: N FE EE O VF RF
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_recFieldExprs RF
============================
<evalExpr {P}> FE EE (recBuild RF) (recVal VF) O
< apply IH6 to R1 Acc _ _ _.
Subgoal 1.24:
Variables: N FE EE O VF RF
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O N **
H1 : is_recFieldExprs RF
H2 : <evalRecFields {P}> FE EE RF VF O
============================
<evalExpr {P}> FE EE (recBuild RF) (recVal VF) O
< search.
Subgoal 1.25:
Variables: N FE EE V O Fields F Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O N **
R2 : lookupRecFieldVal Fields F V
============================
<evalExpr {P}> FE EE (recFieldAccess Rec F) V O
< case IsE.
Subgoal 1.25:
Variables: N FE EE V O Fields F Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O N **
R2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
<evalExpr {P}> FE EE (recFieldAccess Rec F) V O
< apply IH4 to R1 Acc _ _ _.
Subgoal 1.25:
Variables: N FE EE V O Fields F Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O N **
R2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
H3 : <evalExpr {P}> FE EE Rec (recVal Fields) O
============================
<evalExpr {P}> FE EE (recFieldAccess Rec F) V O
< search.
Subgoal 2.1:
Variables: FE EE
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 [] [] 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 [] []
< search.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< Acc': case Acc (keep).
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< LE_N3: apply ext_size_pos_evalArgs to R3.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< apply ext_size_is_int_evalArgs to R3.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< Is: case IsA.
Subgoal 2.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< LN2: case OrN2.
Subgoal 2.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< A2: apply Acc' to _ LN2.
Subgoal 2.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< apply IH to R2 A2 _ _ _.
Subgoal 2.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 2.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< LN3: case OrN3.
Subgoal 2.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< A3: apply Acc' to _ LN3.
Subgoal 2.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< apply IH5 to R3 A3 _ _ _.
Subgoal 2.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalArgs {P}> FE EE Rest VRest O3
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< search.
Subgoal 2.2.1.2:
Variables: N FE EE O N2 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< apply IH5 to R3 Acc _ _ _.
Subgoal 2.2.1.2:
Variables: N FE EE O N2 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
H3 : <evalArgs {P}> FE EE Rest VRest O3
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< search.
Subgoal 2.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 2.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 2.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< LN3: case OrN3.
Subgoal 2.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< A3: apply Acc' to _ LN3.
Subgoal 2.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< apply IH5 to R3 A3 _ _ _.
Subgoal 2.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalArgs {P}> FE EE Rest VRest O3
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< search.
Subgoal 2.2.2.2:
Variables: N FE EE O O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< apply IH5 to R3 Acc _ _ _.
Subgoal 2.2.2.2:
Variables: N FE EE O O2 O3 VRest V1 Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalArgs {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
H3 : <evalArgs {P}> FE EE Rest VRest O3
============================
<evalArgs {P}> FE EE (consArgs E Rest) (V1::VRest) O
< search.
Subgoal 3.1:
Variables: FE EE
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 nilRecFieldVals [] 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 nilRecFieldVals []
< search.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest O3 N3 **
R4 : O2 ++ O3 = O
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< Acc': case Acc (keep).
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest O3 N3 **
R4 : O2 ++ O3 = O
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< LE_N2: apply ext_size_pos_evalExpr to R2.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< LE_N3: apply ext_size_pos_evalRecFields to R3.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< OrN2: apply lt_left to R1 _ _.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< apply ext_size_is_int_evalRecFields to R3.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< OrN3: apply lt_right to R1 _ _ _.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< Is: case IsRF.
Subgoal 3.2:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< LN2: case OrN2.
Subgoal 3.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< A2: apply Acc' to _ LN2.
Subgoal 3.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< apply IH to R2 A2 _ _ _.
Subgoal 3.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 3.2.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< LN3: case OrN3.
Subgoal 3.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< A3: apply Acc' to _ LN3.
Subgoal 3.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< apply IH6 to R3 A3 _ _ _.
Subgoal 3.2.1.1:
Variables: N FE EE O N2 N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalRecFields {P}> FE EE Rest VRest O3
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< search.
Subgoal 3.2.1.2:
Variables: N FE EE O N2 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< apply IH6 to R3 Acc _ _ _.
Subgoal 3.2.1.2:
Variables: N FE EE O N2 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N2 **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
H3 : <evalRecFields {P}> FE EE Rest VRest O3
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< search.
Subgoal 3.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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) (consRecFieldVals F V1 VRest) O
< apply IH4 to R2 Acc _ _ _.
Subgoal 3.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< Ev: apply drop_ext_size_evalExpr to R2.
Subgoal 3.2.2:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< LN3: case OrN3.
Subgoal 3.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< A3: apply Acc' to _ LN3.
Subgoal 3.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< apply IH6 to R3 A3 _ _ _.
Subgoal 3.2.2.1:
Variables: N FE EE O N3 O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalRecFields {P}> FE EE Rest VRest O3
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< search.
Subgoal 3.2.2.2:
Variables: N FE EE O O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< apply IH6 to R3 Acc _ _ _.
Subgoal 3.2.2.2:
Variables: N FE EE O O2 O3 VRest V1 F Rest E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) (consRecFieldVals F V1 VRest) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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 O2 N **
R3 : <evalRecFields {ES}> FE EE Rest VRest 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 O2
Ev : evalExpr FE EE E V1 O2
H3 : <evalRecFields {P}> FE EE Rest VRest O3
============================
<evalRecFields {P}> FE EE (consRecFieldExprs F E Rest) (consRecFieldVals F V1 VRest) O
< search.
Subgoal 4.1:
Variables: FE EE'
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O EE1 Scope V X E Ty
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE1)
IsS : is_stmt (declare Ty X E)
R1 : <evalExpr {ES}> FE (Scope::EE1) E V O N **
============================
<evalStmt {P}> FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O
< case IsS.
Subgoal 4.3:
Variables: N FE O EE1 Scope V X E Ty
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE1)
R1 : <evalExpr {ES}> FE (Scope::EE1) E V O N **
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
<evalStmt {P}> FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O
< apply IH4 to R1 Acc _ _ _.
Subgoal 4.3:
Variables: N FE O EE1 Scope V X E Ty
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE1)
R1 : <evalExpr {ES}> FE (Scope::EE1) E V O N **
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
H4 : <evalExpr {P}> FE (Scope::EE1) E V O
============================
<evalStmt {P}> FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O
< search.
Subgoal 4.4:
Variables: N FE EE EE' O V E X
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : replaceScopes X V EE EE'
============================
<evalStmt {P}> FE EE (assign X E) EE' O
< case IsS.
Subgoal 4.4:
Variables: N FE EE EE' O V E X
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : replaceScopes X V EE 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 E X
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
H3 : <evalExpr {P}> FE EE E V O
============================
<evalStmt {P}> FE EE (assign X E) EE' O
< search.
Subgoal 4.5:
Variables: N FE EE EE' O V FieldVals NewVals E Fields Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : lookupScopes Rec EE (recVal FieldVals)
R3 : updateRecFields Fields V FieldVals NewVals
R4 : replaceScopes Rec (recVal NewVals) EE EE'
============================
<evalStmt {P}> FE EE (recUpdate Rec Fields E) EE' O
< case IsS.
Subgoal 4.5:
Variables: N FE EE EE' O V FieldVals NewVals E Fields Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : lookupScopes Rec EE (recVal FieldVals)
R3 : updateRecFields Fields V FieldVals NewVals
R4 : replaceScopes Rec (recVal NewVals) EE 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 FieldVals NewVals E Fields Rec
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
R2 : lookupScopes Rec EE (recVal FieldVals)
R3 : updateRecFields Fields V FieldVals NewVals
R4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
H4 : <evalExpr {P}> FE EE E V O
============================
<evalStmt {P}> FE EE (recUpdate Rec Fields E) EE' O
< search.
Subgoal 4.6:
Variables: N FE EE EE' O N2 N3 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond trueVal O2
Ev : evalExpr FE EE Cond trueVal O2
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N2 **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
LN2 : N2 < N
A2 : acc N2 *
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
LN3 : N3 < N
A3 : acc N3 *
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
============================
<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 O2 Scope O3 El Th Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R3 : <evalStmt {ES}> FE ([]::EE) 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 O2
H2 : <evalExpr {P}> FE EE Cond falseVal O2
Ev : evalExpr FE EE Cond falseVal O2
H3 : <evalStmt {P}> FE ([]::EE) 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
============================
<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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
<evalStmt {P}> FE EE (while Cond Body) EE' O
< case IsEE4+.
Subgoal 4.8:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
============================
<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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2.
Subgoal 4.8.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 O2
< LN3: case Or3.
Subgoal 4.8.1.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
H7 : 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 O2
< A3: apply Acc' to _ LN3.
Subgoal 4.8.1.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
H7 : 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 O2
< apply IH4 to R3 A3 _ _ _.
Subgoal 4.8.1.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
============================
<evalExpr {P}> FE EE Cond trueVal O2
< search.
Subgoal 4.8.1.2:
Variables: N FE EE EE' O N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
H7 : 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 O2
< apply IH4 to R3 Acc _ _ _.
Subgoal 4.8.1.2:
Variables: N FE EE EE' O N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
============================
<evalExpr {P}> FE EE Cond trueVal O2
< search.
Subgoal 4.8:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
============================
<evalStmt {P}> FE EE (while Cond Body) EE' O
< assert <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3.
Subgoal 4.8.2:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< LN2: case Or2.
Subgoal 4.8.2.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
LN2 : N2 < N
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< A2: apply Acc' to _ LN2.
Subgoal 4.8.2.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
LN2 : N2 < N
A2 : acc N2 *
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< apply IH7 to R4 A2 _ _ _.
Subgoal 4.8.2.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
LN2 : N2 < N
A2 : acc N2 *
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< search.
Subgoal 4.8.2.2:
Variables: N FE EE EE' O N3 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N
LE_N2_N5 : N <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< apply IH7 to R4 Acc _ _ _.
Subgoal 4.8.2.2:
Variables: N FE EE EE' O N3 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N
LE_N2_N5 : N <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
============================
<evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
< search.
Subgoal 4.8:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
============================
<evalStmt {P}> FE EE (while Cond Body) EE' O
< assert <evalStmt {P}> FE EE3 (while Cond Body) EE' O4.
Subgoal 4.8.3:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
============================
<evalStmt {P}> FE EE3 (while Cond Body) EE' O4
< LN4: case Or4.
Subgoal 4.8.3.1:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
LN4 : N4 < N
============================
<evalStmt {P}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
LN4 : N4 < N
A4 : acc N4 *
============================
<evalStmt {P}> FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
LN4 : N4 < N
A4 : acc N4 *
H10 : <evalStmt {P}> FE EE3 (while Cond Body) EE' O4
============================
<evalStmt {P}> FE EE3 (while Cond Body) EE' O4
< search.
Subgoal 4.8.3.2:
Variables: N FE EE EE' O N3 N2 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
============================
<evalStmt {P}> FE EE3 (while Cond Body) EE' O4
< apply IH7 to R5 Acc _ _ _.
Subgoal 4.8.3.2:
Variables: N FE EE EE' O N3 N2 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
H10 : <evalStmt {P}> FE EE3 (while Cond Body) EE' O4
============================
<evalStmt {P}> FE EE3 (while Cond Body) EE' O4
< search.
Subgoal 4.8:
Variables: N FE EE EE' O N3 N2 N4 N5 O2 Scope EE3 O3 O4 O12 Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N3 **
R4 : <evalStmt {ES}> FE ([]::EE) Body (Scope::EE3) O3 N2 **
R5 : <evalStmt {ES}> FE EE3 (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 O2
EvBody : evalStmt FE ([]::EE) Body (Scope::EE3) O3
H1 : is_list (is_pair is_string is_value) Scope
H2 : is_list (is_list (is_pair is_string is_value)) EE3
H3 : is_integer N3
H4 : is_integer N4
H5 : is_integer N2
LE_N2_N5 : N2 <= N5
LE_N4_N5 : N4 <= N5
H6 : 0 <= N5
Or3 : N3 < N \/ N3 = N
H7 : 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 *
H8 : <evalExpr {P}> FE EE Cond trueVal O2
H9 : <evalStmt {P}> FE ([]::EE) Body (Scope::EE3) O3
H10 : <evalStmt {P}> FE EE3 (while Cond Body) EE' O4
============================
<evalStmt {P}> FE EE (while Cond Body) EE' O
< search.
Subgoal 4.9:
Variables: N FE EE' O Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
============================
<evalStmt {P}> FE EE' (while Cond Body) EE' O
< case IsS.
Subgoal 4.9:
Variables: N FE EE' O Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 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' O Body Cond
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O N **
H1 : is_expr Cond
H2 : is_stmt Body
H3 : <evalExpr {P}> FE EE' Cond falseVal 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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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' O I O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O2 N **
R2 : O2 ++ [intVal I] = O
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< case IsS.
Subgoal 4.11:
Variables: N FE EE' O I O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) 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' O I O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O2 N **
R2 : O2 ++ [intVal I] = O
H1 : is_expr E
H2 : <evalExpr {P}> FE EE' E (intVal I) O2
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< search.
Subgoal 4.12:
Variables: N FE EE' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R2 : O2 ++ [trueVal] = O
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< case IsS.
Subgoal 4.12:
Variables: N FE EE' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 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' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R2 : O2 ++ [trueVal] = O
H1 : is_expr E
H2 : <evalExpr {P}> FE EE' E trueVal O2
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< search.
Subgoal 4.13:
Variables: N FE EE' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R2 : O2 ++ [falseVal] = O
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< case IsS.
Subgoal 4.13:
Variables: N FE EE' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 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' O O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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 O2 N **
R2 : O2 ++ [falseVal] = O
H1 : is_expr E
H2 : <evalExpr {P}> FE EE' E falseVal O2
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< search.
Subgoal 4.14:
Variables: N FE EE' O S1 O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O2 N **
R2 : O2 ++ [stringVal S1] = O
============================
<evalStmt {P}> FE EE' (printVal E) EE' O
< case IsS.
Subgoal 4.14:
Variables: N FE EE' O S1 O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) 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' O S1 O2 E
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
<evalRecFields {P}> FE EE RF V O
IH7 : forall N FE EE S EE' O,
<evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_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) O2 N **
R2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
H2 : <evalExpr {P}> FE EE' E (stringVal S1) 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 :
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 -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty.
============================
forall Fields FieldTys F V Ty,
valFieldTys Fields FieldTys -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
< induction on 1.
IH : forall Fields FieldTys F V Ty,
valFieldTys Fields FieldTys * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
============================
forall Fields FieldTys F V Ty,
valFieldTys Fields FieldTys @ -> lookupRecFieldVal 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
VFT : valFieldTys Fields FieldTys @
LV : lookupRecFieldVal 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
LV : lookupRecFieldVal nilRecFieldVals 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
LV : lookupRecFieldVal (consRecFieldVals 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 * -> lookupRecFieldVal 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 * -> lookupRecFieldVal 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 * -> lookupRecFieldVal 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 * -> lookupRecFieldVal 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 : lookupRecFieldVal 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
VFT : valueType V1 Ty *
VFT1 : valFieldTys Rest RestTys *
LV : F = F -> false
LV1 : lookupRecFieldVal 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
VFT : valueType V1 Ty1 *
VFT1 : valFieldTys Rest RestTys *
LV : F1 = F -> false
LV1 : lookupRecFieldVal 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 * -> lookupRecFieldVal Fields F V -> lookupRecFieldTy FieldTys F Ty ->
valueType V Ty
VFT : valueType V1 Ty1 *
VFT1 : valFieldTys Rest RestTys *
LV : F1 = F -> false
LV1 : lookupRecFieldVal 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 (consRecFieldVals F VOld Rest) Tys
L : lookupRecFieldTy Tys F VTy
VTy : valueType V VTy
============================
valFieldTys (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals O VO Rest) Tys
L : lookupRecFieldTy Tys F VTy
VTy : valueType V VTy
RRV : F = O -> false
RRV1 : replaceRecVal F V Rest RRest *
============================
valFieldTys (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals 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 (consRecFieldVals 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : lookupRecFieldVal 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 : forall E FT ET Ty FE 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 O ->
Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, 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_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_S,
evalArgs_typePres : forall A FT ET Tys FE 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 O ->
Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, 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_A,
evalRecFields_typePres : forall RF FT ET FTys FE 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 O ->
Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, 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_RF.
Subgoal 1.1:
Variables: FT ET Ty FE EE I
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.1:
Variables: FT ET FE EE I
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.2:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
============================
valueType (intVal I) Ty
< case Ty.
Subgoal 1.2:
Variables: FT ET FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.3:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
============================
valueType (intVal I) Ty
< case Ty.
Subgoal 1.3:
Variables: FT ET FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.4:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
============================
valueType (intVal I) Ty
< case Ty.
Subgoal 1.4:
Variables: FT ET FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.5:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
============================
valueType (intVal I) Ty
< case Ty.
Subgoal 1.5:
Variables: FT ET FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.6:
Variables: FT ET Ty FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.6:
Variables: FT ET FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.7:
Variables: FT ET Ty FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.7:
Variables: FT ET FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.8:
Variables: FT ET Ty FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.8:
Variables: FT ET FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.9:
Variables: FT ET Ty FE EE O E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.9:
Variables: FT ET FE EE O E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType falseVal boolTy
< search.
Subgoal 1.10:
Variables: FT ET Ty FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.10:
Variables: FT ET FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType falseVal boolTy
< search.
Subgoal 1.11:
Variables: FT ET Ty FE EE O E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.11:
Variables: FT ET FE EE O E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.12:
Variables: FT ET Ty FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.12:
Variables: FT ET FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.13:
Variables: FT ET Ty FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.13:
Variables: FT ET FE EE O O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType falseVal boolTy
< search.
Subgoal 1.14:
Variables: FT ET Ty FE EE O E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.14:
Variables: FT ET FE EE O E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
H1 : typeOf FT ET E1 boolTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.15:
Variables: FT ET Ty FE EE O E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.15:
Variables: FT ET FE EE O E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O *
H1 : typeOf FT ET E1 boolTy
============================
valueType falseVal boolTy
< search.
Subgoal 1.16:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.16:
Variables: FT ET FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.17:
Variables: FT ET Ty FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.17:
Variables: FT ET FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 1.18:
Variables: FT ET Ty FE EE O V1 O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
============================
valueType trueVal Ty
< case Ty.
Subgoal 1.18.1:
Variables: FT ET FE EE O V1 O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 intTy
H2 : typeOf FT ET E2 intTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.18.2:
Variables: FT ET FE EE O V1 O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 boolTy
H2 : typeOf FT ET E2 boolTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.18.3:
Variables: FT ET FE EE O V1 O2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : typeOf FT ET E1 stringTy
H2 : typeOf FT ET E2 stringTy
============================
valueType trueVal boolTy
< search.
Subgoal 1.19:
Variables: FT ET Ty FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
============================
valueType falseVal Ty
< case Ty.
Subgoal 1.19.1:
Variables: FT ET FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 1.19.2:
Variables: FT ET FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 1.19.3:
Variables: FT ET FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 1.20:
Variables: FT ET Ty FE EE S
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.20:
Variables: FT ET FE EE S
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 1.21:
Variables: FT ET Ty FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
============================
valueType (stringVal S) Ty
< case Ty.
Subgoal 1.21:
Variables: FT ET FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 1.22:
Variables: FT ET Ty FE EE V X
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 1.22:
Variables: FT ET Ty FE EE V X
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 1.22:
Variables: FT ET Ty FE EE V X
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
============================
valueType V Ty
< case IsE.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
H1 : is_string Fun
H2 : is_args Args
============================
valueType V Ty
< Ty: case Ty.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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_A to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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_S to _ _ _ _ _ F2 Ev4 _ _.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope TyEnv'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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' EE2
============================
valueType V Ty
< apply stmtOK_older_scopes_same to _ _ _ F2.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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'] EE2
============================
valueType V Ty
< apply stmtOK_first_scope_lookup_same to _ _ _ F2 _.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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'] EE2
H9 : lookup Scope' RetVar Ty
============================
valueType V Ty
< apply related_all_scopes_lookupScopes to R _ Ev6.
Subgoal 1.23:
Variables: FT ET Ty FE EE O V RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun ArgTys Scope Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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'] EE2
H9 : lookup Scope' RetVar Ty
H10 : valueType V Ty
============================
valueType V Ty
< search.
Subgoal 1.24:
Variables: FT ET Ty FE EE O VF RF
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O *
============================
valueType (recVal VF) Ty
< case IsE.
Subgoal 1.24:
Variables: FT ET Ty FE EE O VF RF
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O *
H1 : is_recFieldExprs RF
============================
valueType (recVal VF) Ty
< Ty: case Ty.
Subgoal 1.24:
Variables: FT ET FE EE O VF RF FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O *
H1 : is_recFieldExprs RF
Ty : typeOfRecFields FT ET RF FieldTys
============================
valueType (recVal VF) (recTy FieldTys)
< apply IH_RF to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 1.24:
Variables: FT ET FE EE O VF RF FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
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 O *
H1 : is_recFieldExprs RF
Ty : typeOfRecFields FT ET RF FieldTys
H2 : valFieldTys VF FieldTys
============================
valueType (recVal VF) (recTy FieldTys)
< search.
Subgoal 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal Fields F V
============================
valueType V Ty
< case IsE.
Subgoal 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
valueType V Ty
< Ty: case Ty.
Subgoal 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal 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_E to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal 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 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal 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 1.25:
Variables: FT ET Ty FE EE O V Fields F Rec FieldTys
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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) O *
Ev2 : lookupRecFieldVal 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 2.1:
Variables: FT ET ET' FE EE'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 2.1:
Variables: FT ET' FE EE'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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_S to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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_S to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 2.2:
Variables: FT ET ET' FE EE EE' O EE3 O2 O3 S2 S1 TC1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.3:
Variables: FT ET ET' FE O EE1 Scope V X E Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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)) (Scope::EE1)
Ty : stmtOK FT ET (declare Ty X E) ET'
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
related_all_scopes ET' (((X, V)::Scope)::EE1)
< case IsS.
Subgoal 2.3:
Variables: FT ET ET' FE O EE1 Scope V X E Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (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::EE1)
Ty : stmtOK FT ET (declare Ty X E) ET'
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V O *
H1 : is_typ Ty
H2 : is_string X
H3 : is_expr E
============================
related_all_scopes ET' (((X, V)::Scope)::EE1)
< Ty: case Ty.
Subgoal 2.3:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (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) (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
< apply IH_E to _ _ _ _ _ Ty1 Ev1 _ _.
Subgoal 2.3:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (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) (Scope::EE1)
Ev1 : evalExpr FE (Scope::EE1) E V 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)::EE1)
< R: case Ctxs.
Subgoal 2.3:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
related_all_scopes (((X, Ty)::Scope1)::RestTC) (((X, V)::Scope)::EE1)
< unfold .
Subgoal 2.3.1:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
forall X1 T,
lookup ((X, Ty)::Scope1) X1 T -> exists V1,
lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< intros L.
Subgoal 2.3.1:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
L : lookup ((X, Ty)::Scope1) X1 T
============================
exists V1, lookup ((X, V)::Scope) X1 V1 /\ valueType V1 T
< L: case L.
Subgoal 2.3.1.1:
Variables: FT FE O EE1 Scope V E RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare T X1 E) (((X1, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
exists V1, lookup ((X1, V)::Scope) X1 V1 /\ valueType V1 T
< search.
Subgoal 2.3.1.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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 2.3.1.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T V1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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 2.3.1.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T V1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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 2.3.1.2.1:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T V1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
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 2.3.1.2.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1 T V1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
L : X = X1 -> false
L1 : lookup Scope1 X1 T
H5 : lookup Scope X1 V1
H6 : valueType V1 T
============================
valueType V1 T
< search.
Subgoal 2.3.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
forall X1, no_lookup ((X, Ty)::Scope1) X1 -> no_lookup ((X, V)::Scope) X1
< intros N.
Subgoal 2.3.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
N : no_lookup ((X, Ty)::Scope1) X1
============================
no_lookup ((X, V)::Scope) X1
< N: case N.
Subgoal 2.3.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
N : X = X1 -> false
N1 : no_lookup Scope1 X1
============================
no_lookup ((X, V)::Scope) X1
< apply R1 to N1.
Subgoal 2.3.2:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1 X1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
N : X = X1 -> false
N1 : no_lookup Scope1 X1
H5 : no_lookup Scope X1
============================
no_lookup ((X, V)::Scope) X1
< search.
Subgoal 2.3.3:
Variables: FT FE O EE1 Scope V X E Ty RestTC Scope1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ev1 : evalExpr FE (Scope::EE1) E V 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 EE1
============================
related_all_scopes RestTC EE1
< search.
Subgoal 2.4:
Variables: FT ET ET' FE EE EE' O V E X
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O *
Ev2 : replaceScopes X V EE EE'
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.4:
Variables: FT ET ET' FE EE EE' O V E X
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.4:
Variables: FT ET' FE EE EE' O V E X Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : replaceScopes X V EE 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'
< apply IH_E to _ _ _ _ _ Ty1 Ev1 _ _.
Subgoal 2.4:
Variables: FT ET' FE EE EE' O V E X Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
Ty : lookupScopes X ET' Ty
Ty1 : typeOf FT ET' E Ty
H3 : valueType V Ty
============================
related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ Ctxs Ev2 Ty _.
Subgoal 2.4:
Variables: FT ET' FE EE EE' O V E X Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : replaceScopes X V EE EE'
H1 : is_string X
H2 : is_expr E
Ty : lookupScopes X ET' Ty
Ty1 : typeOf FT ET' E Ty
H3 : valueType V Ty
H4 : related_all_scopes ET' EE'
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.5:
Variables: FT ET ET' FE EE EE' O V FieldVals NewVals E Fields Rec
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.5:
Variables: FT ET ET' FE EE EE' O V FieldVals NewVals E Fields Rec
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
H1 : is_string Rec
H2 : is_list is_string Fields
H3 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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'
< apply IH_E to _ _ _ _ _ Ty1 Ev1 _ _.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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
H4 : valueType V Ty
============================
related_all_scopes ET' EE'
< RFTy: apply related_all_scopes_lookupScopes to Ctxs Ty Ev2.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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
H4 : valueType V Ty
RFTy : valueType (recVal FieldVals) (recTy FieldTys)
============================
related_all_scopes ET' EE'
< case RFTy.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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
H4 : valueType V Ty
H5 : valFieldTys FieldVals FieldTys
============================
related_all_scopes ET' EE'
< apply updateRecFields_typePres to Ty2 Ev3 _ _.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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
H4 : valueType V Ty
H5 : valFieldTys FieldVals FieldTys
H6 : valFieldTys NewVals FieldTys
============================
related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ Ctxs Ev4 Ty _.
Subgoal 2.5:
Variables: FT ET' FE EE EE' O V FieldVals NewVals E Fields Rec FieldTys Ty
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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
H4 : valueType V Ty
H5 : valFieldTys FieldVals FieldTys
H6 : valFieldTys NewVals FieldTys
H7 : related_all_scopes ET' EE'
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.6:
Variables: FT ET ET' FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.6:
Variables: FT ET ET' FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 2.6:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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'
< apply related_all_scopes_add_scope to Ctxs.
Subgoal 2.6:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
============================
related_all_scopes ET' EE'
< R': apply IH_S to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 2.6:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes TCTh (Scope::EE')
============================
related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty1.
Subgoal 2.6:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCEl Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes (Scope'::ET') (Scope::EE')
============================
related_all_scopes ET' EE'
< case R'.
Subgoal 2.6:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCEl Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
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' EE'
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.7:
Variables: FT ET ET' FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.7:
Variables: FT ET ET' FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 2.7:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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'
< apply related_all_scopes_add_scope to Ctxs.
Subgoal 2.7:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
============================
related_all_scopes ET' EE'
< R': apply IH_S to _ _ _ _ _ Ty2 Ev2 _ _.
Subgoal 2.7:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh TCEl
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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
H4 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes TCEl (Scope::EE')
============================
related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty2.
Subgoal 2.7:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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')
H4 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes (Scope'::ET') (Scope::EE')
============================
related_all_scopes ET' EE'
< case R'.
Subgoal 2.7:
Variables: FT ET' FE EE EE' O O2 Scope O3 El Th Cond TCTh Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) 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')
H4 : related_all_scopes ([]::ET') ([]::EE)
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' EE'
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.8:
Variables: FT ET ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (while Cond Body) EE' O4 *
Ev4 : O2 ++ O3 = O12
Ev5 : O12 ++ O4 = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.8:
Variables: FT ET ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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'
< apply related_all_scopes_add_scope to Ctxs.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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
H3 : related_all_scopes ([]::ET') ([]::EE)
============================
related_all_scopes ET' EE'
< R': apply IH_S to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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
H3 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes TC2 (Scope::EE3)
============================
related_all_scopes ET' EE'
< apply stmtOK_older_scopes_same to _ _ _ Ty1.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
H3 : related_all_scopes ([]::ET') ([]::EE)
R' : related_all_scopes (Scope'::ET') (Scope::EE3)
============================
related_all_scopes ET' EE'
< case R'.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
H3 : related_all_scopes ([]::ET') ([]::EE)
H4 : forall X T,
lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H5 : forall X, no_lookup Scope' X -> no_lookup Scope X
H6 : related_all_scopes ET' EE3
============================
related_all_scopes ET' EE'
< Is: apply evalStmt_isCtx to _ _ _ Ev2.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
H3 : related_all_scopes ([]::ET') ([]::EE)
H4 : forall X T,
lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H5 : forall X, no_lookup Scope' X -> no_lookup Scope X
H6 : related_all_scopes ET' EE3
Is : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
related_all_scopes ET' EE'
< case Is.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
H3 : related_all_scopes ([]::ET') ([]::EE)
H4 : forall X T,
lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H5 : forall X, no_lookup Scope' X -> no_lookup Scope X
H6 : related_all_scopes ET' EE3
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE3
============================
related_all_scopes ET' EE'
< apply IH_S to _ _ _ _ _ _ Ev3 _ _.
Subgoal 2.8:
Variables: FT ET' FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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')
H3 : related_all_scopes ([]::ET') ([]::EE)
H4 : forall X T,
lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H5 : forall X, no_lookup Scope' X -> no_lookup Scope X
H6 : related_all_scopes ET' EE3
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE3
H9 : related_all_scopes ET' EE'
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.9:
Variables: FT ET ET' FE EE' O Body Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O *
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.9:
Variables: FT ET ET' FE EE' O Body Cond
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.9:
Variables: FT ET' FE EE' O Body Cond TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 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'
< search.
Subgoal 2.10:
Variables: FT ET ET' FE EE EE' O Scope S1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 2.10:
Variables: FT ET ET' FE EE EE' O Scope S1
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 2.10:
Variables: FT ET' FE EE EE' O Scope S1 TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.10:
Variables: FT ET' FE EE EE' O Scope S1 TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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_S to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 2.10:
Variables: FT ET' FE EE EE' O Scope S1 TC2
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.10:
Variables: FT ET' FE EE EE' O Scope S1 Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.10:
Variables: FT ET' FE EE EE' O Scope S1 Scope'
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 2.11:
Variables: FT ET ET' FE EE' O I O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.11:
Variables: FT ET ET' FE EE' O I O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.11.1:
Variables: FT ET' FE EE' O I O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
Ty : typeOf FT ET' E intTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.11.2:
Variables: FT ET' FE EE' O I O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
Ty : typeOf FT ET' E boolTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.11.3:
Variables: FT ET' FE EE' O I O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
Ty : typeOf FT ET' E stringTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.12:
Variables: FT ET ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O2 *
Ev2 : O2 ++ [trueVal] = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.12:
Variables: FT ET ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.12.1:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E intTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.12.2:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E boolTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.12.3:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E stringTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.13:
Variables: FT ET ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 O2 *
Ev2 : O2 ++ [falseVal] = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.13:
Variables: FT ET ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.13.1:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E intTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.13.2:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E boolTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.13.3:
Variables: FT ET' FE EE' O O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
Ty : typeOf FT ET' E stringTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.14:
Variables: FT ET ET' FE EE' O S1 O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
related_all_scopes ET' EE'
< case IsS.
Subgoal 2.14:
Variables: FT ET ET' FE EE' O S1 O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
============================
related_all_scopes ET' EE'
< Ty: case Ty.
Subgoal 2.14.1:
Variables: FT ET' FE EE' O S1 O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
Ty : typeOf FT ET' E intTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.14.2:
Variables: FT ET' FE EE' O S1 O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
Ty : typeOf FT ET' E boolTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 2.14.3:
Variables: FT ET' FE EE' O S1 O2 E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
Ty : typeOf FT ET' E stringTy
============================
related_all_scopes ET' EE'
< search.
Subgoal 3.1:
Variables: FT ET Tys FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 [] [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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
< Ev: case Ev.
Subgoal 3.1:
Variables: FT ET Tys FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 3.1:
Variables: FT ET FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 3.2:
Variables: FT ET Tys FE EE O O2 O3 VRest V Rest E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
valueTypeList (V::VRest) Tys
< case IsA.
Subgoal 3.2:
Variables: FT ET Tys FE EE O O2 O3 VRest V Rest E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
============================
valueTypeList (V::VRest) Tys
< Ty: case Ty.
Subgoal 3.2:
Variables: FT ET FE EE O O2 O3 VRest V Rest E ETys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalArgs FE EE Rest VRest 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_E to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 3.2:
Variables: FT ET FE EE O O2 O3 VRest V Rest E ETys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 : valueType V ETy
============================
valueTypeList (V::VRest) (ETy::ETys)
< apply IH_A to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 3.2:
Variables: FT ET FE EE O O2 O3 VRest V Rest E ETys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalArgs FE EE Rest VRest 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 : valueType V ETy
H4 : valueTypeList VRest ETys
============================
valueTypeList (V::VRest) (ETy::ETys)
< search.
Subgoal 4.1:
Variables: FT ET FTys FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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 nilRecFieldVals [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 nilRecFieldVals FTys
< Ev: case Ev.
Subgoal 4.1:
Variables: FT ET FTys FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 nilRecFieldVals FTys
< case Ty.
Subgoal 4.1:
Variables: FT ET FE EE
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, 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 nilRecFieldVals nilRecFieldTys
< search.
Subgoal 4.2:
Variables: FT ET FTys FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists 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) (consRecFieldVals F V VRest) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
valFieldTys (consRecFieldVals F V VRest) FTys
< case IsRF.
Subgoal 4.2:
Variables: FT ET FTys FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_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) (consRecFieldVals F V VRest) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
============================
valFieldTys (consRecFieldVals F V VRest) FTys
< Ty: case Ty.
Subgoal 4.2:
Variables: FT ET FE EE O O2 O3 VRest V F Rest E RestTys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (consRecFieldVals F V VRest) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 (consRecFieldVals F V VRest) (consRecFieldTys F ETy RestTys)
< apply IH_E to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 4.2:
Variables: FT ET FE EE O O2 O3 VRest V F Rest E RestTys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (consRecFieldVals F V VRest) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 : valueType V ETy
============================
valFieldTys (consRecFieldVals F V VRest) (consRecFieldTys F ETy RestTys)
< apply IH_RF to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 4.2:
Variables: FT ET FE EE O O2 O3 VRest V F Rest E RestTys ETy
IH_E : forall E FT ET Ty FE EE O V,
is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueType V Ty
IH_S : forall S FT ET ET' FE EE EE' O,
is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
related_all_scopes ET' EE'
IH_A : forall A FT ET Tys FE EE O Vs,
is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valueTypeList Vs Tys
IH_RF : forall RF FT ET FTys FE EE O FVs,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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) (consRecFieldVals F V VRest) O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
exists Scope TyEnv',
(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 O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 : valueType V ETy
H5 : valFieldTys VRest RestTys
============================
valFieldTys (consRecFieldVals 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 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 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 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 O ->
output_forms O
on Ev as IH_A,
evalRecFields_output_forms : forall RF FE EE Fields 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 O ->
output_forms O
on Ev as IH_RF.
Subgoal 1.1:
Variables: FE EE I
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) [] @
============================
output_forms []
< search.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.2:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 + I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.3:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 - I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.4:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 * I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.5:
Variables: FE EE O I1 O2 I2 O3 I E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 / I2 = I
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.6:
Variables: FE EE
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 [] @
============================
output_forms []
< search.
Subgoal 1.7:
Variables: FE EE
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 [] @
============================
output_forms []
< search.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.8:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
output_forms O
< case IsE.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.9:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O
============================
output_forms O
< search.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.10:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
output_forms O
< case IsE.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
H2 : is_expr E2
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.11:
Variables: FE EE O E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O
============================
output_forms O
< search.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal 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 O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.12:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 trueVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal 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 O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.13:
Variables: FE EE O O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O2 *
Ev2 : evalExpr FE EE E2 falseVal O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
============================
output_forms O
< case IsE.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.14:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 falseVal O *
H1 : is_expr E1
H2 : output_forms O
============================
output_forms O
< search.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
============================
output_forms O
< case IsE.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.15:
Variables: FE EE O E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 trueVal O *
H1 : is_expr E1
H2 : output_forms O
============================
output_forms O
< search.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.16:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 > I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) 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 O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.17:
Variables: FE EE O I1 O2 I2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (intVal I1) O2 *
Ev2 : evalExpr FE EE E2 (intVal I2) O3 *
Ev3 : I1 <= I2
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 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 O V1 O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.18:
Variables: FE EE O V1 O2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V1 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 O V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 IH_E to _ _ _ Ev2.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.19:
Variables: FE EE O V1 O2 V2 O3 E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : V1 = V2 -> false
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.20:
Variables: FE EE S
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) [] @
============================
output_forms []
< search.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 O S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) 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 IH_E to _ _ _ Ev2.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 1.21:
Variables: FE EE O S1 O2 S2 O3 S E2 E1
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E1 (stringVal S1) O2 *
Ev2 : evalExpr FE EE E2 (stringVal S2) O3 *
Ev3 : S1 ++ S2 = S
Ev4 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 1.22:
Variables: FE EE V X
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 [] @
Ev1 : lookupScopes X EE V
============================
output_forms []
< search.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 V
============================
output_forms O
< case IsE.
Subgoal 1.23:
Variables: FE EE V O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O RetVar RVVal ArgNames Body ArgVals O2 InitEnv EE2 O3 Args Fun
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : lookup FE Fun (RetVar, (RVVal, (ArgNames, Body)))
Ev2 : evalArgs FE EE Args ArgVals O2 *
Ev3 : zip ArgNames ArgVals InitEnv
Ev4 : evalStmt FE [(RetVar, RVVal)::InitEnv] Body EE2 O3 *
Ev5 : O2 ++ O3 = O
Ev6 : lookupScopes RetVar EE2 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 O VF RF
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalRecFields FE EE RF VF O *
============================
output_forms O
< case IsE.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
============================
output_forms O
< apply IH_RF to _ _ _ Ev1.
Subgoal 1.24:
Variables: FE EE O VF RF
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalRecFields FE EE RF VF O *
H1 : is_recFieldExprs RF
H2 : output_forms O
============================
output_forms O
< search.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
============================
output_forms O
< case IsE.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal Fields F V
H1 : is_expr Rec
H2 : is_string F
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.25:
Variables: FE EE V O Fields F Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE Rec (recVal Fields) O *
Ev2 : lookupRecFieldVal 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O EE1 Scope V X E Ty
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V O *
============================
output_forms O
< case IsS.
Subgoal 2.3:
Variables: FE O EE1 Scope V X E Ty
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 O EE1 Scope V X E Ty
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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)) (Scope::EE1)
Ev : evalStmt FE (Scope::EE1) (declare Ty X E) (((X, V)::Scope)::EE1) O @
Ev1 : evalExpr FE (Scope::EE1) E V 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 E X
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : replaceScopes X V EE EE'
============================
output_forms O
< case IsS.
Subgoal 2.4:
Variables: FE EE EE' O V E X
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : replaceScopes X V EE 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 E X
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : replaceScopes X V EE 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 FieldVals NewVals E Fields Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE EE'
============================
output_forms O
< case IsS.
Subgoal 2.5:
Variables: FE EE EE' O V FieldVals NewVals E Fields Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 FieldVals NewVals E Fields Rec
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
Ev2 : lookupScopes Rec EE (recVal FieldVals)
Ev3 : updateRecFields Fields V FieldVals NewVals
Ev4 : replaceScopes Rec (recVal NewVals) EE 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Th (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsS.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 IH_S to _ _ _ Ev2.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 2.6:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 : output_forms O3
H6 : output_forms O
============================
output_forms O
< search.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) El (Scope::EE') O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsS.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 IH_S to _ _ _ Ev2.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 2.7:
Variables: FE EE EE' O O2 Scope O3 El Th Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) 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 : output_forms O3
H6 : output_forms O
============================
output_forms O
< search.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 IH_S to _ _ _ Ev2.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
============================
output_forms O
< IsEE4+: apply evalStmt_isCtx to _ _ _ Ev2.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
IsEE4+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
output_forms O
< case IsEE4+.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
output_forms O
< apply IH_S to _ _ _ Ev3.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : output_forms O4
============================
output_forms O
< apply output_forms_append to _ _ Ev4.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : output_forms O4
H8 : output_forms O12
============================
output_forms O
< apply output_forms_append to _ _ Ev5.
Subgoal 2.8:
Variables: FE EE EE' O O2 Scope EE3 O3 O4 O12 Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : evalStmt FE ([]::EE) Body (Scope::EE3) O3 *
Ev3 : evalStmt FE EE3 (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 : output_forms O3
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : output_forms O4
H8 : output_forms O12
H9 : output_forms O
============================
output_forms O
< search.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
============================
output_forms O
< case IsS.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O *
H1 : is_expr Cond
H2 : is_stmt Body
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 2.9:
Variables: FE EE' O Body Cond
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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' O I O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O2 *
Ev2 : O2 ++ [intVal I] = O
============================
output_forms O
< case IsS.
Subgoal 2.11:
Variables: FE EE' O I O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O2 *
Ev2 : O2 ++ [intVal I] = O
H1 : is_expr E
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 2.11:
Variables: FE EE' O I O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) 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' O I O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) 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' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : O2 ++ [trueVal] = O
============================
output_forms O
< case IsS.
Subgoal 2.12:
Variables: FE EE' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : O2 ++ [trueVal] = O
H1 : is_expr E
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 2.12:
Variables: FE EE' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 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' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 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' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : O2 ++ [falseVal] = O
============================
output_forms O
< case IsS.
Subgoal 2.13:
Variables: FE EE' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : O2 ++ [falseVal] = O
H1 : is_expr E
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 2.13:
Variables: FE EE' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 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' O O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 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' O S1 O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
============================
output_forms O
< case IsS.
Subgoal 2.14:
Variables: FE EE' O S1 O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O2 *
Ev2 : O2 ++ [stringVal S1] = O
H1 : is_expr E
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 2.14:
Variables: FE EE' O S1 O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) 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' O S1 O2 E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) 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 O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 [] [] @
============================
output_forms []
< search.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsA.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalArgs FE EE Rest VRest 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 O O2 O3 VRest V Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : output_forms O2
============================
output_forms O
< apply IH_A to _ _ _ Ev2.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : output_forms O2
H4 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 3.2:
Variables: FE EE O O2 O3 VRest V Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalArgs FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E
H2 : is_args Rest
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
output_forms O
< search.
Subgoal 4.1:
Variables: FE EE
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 nilRecFieldVals [] @
============================
output_forms []
< search.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consRecFieldVals F V VRest) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsRF.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consRecFieldVals F V VRest) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 O O2 O3 VRest V F Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consRecFieldVals F V VRest) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalRecFields FE EE Rest VRest 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 IH_RF to _ _ _ Ev2.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consRecFieldVals F V VRest) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
H4 : output_forms O2
H5 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 4.2:
Variables: FE EE O O2 O3 VRest V F Rest E
IH_E : forall E FE EE V O,
is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V 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 O,
is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields O,
is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consRecFieldVals F V VRest) O @
Ev1 : evalExpr FE EE E V O2 *
Ev2 : evalRecFields FE EE Rest VRest O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string F
H2 : is_expr E
H3 : is_recFieldExprs Rest
H4 : output_forms O2
H5 : output_forms O3
H6 : 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.